Hi! This patch fixes a thinko in POP macro in c_parser_binary_expression that resulted in not triggering the build2 case if omp_atomic_lhs is non-NULL.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk so far, 4.9 testing in progress, 4.8 will follow at some point. 2015-02-11 Jakub Jelinek <ja...@redhat.com> PR c/64824 * c-parser.c (c_parser_binary_expression): Fix OpenMP stack[sp].prec check in the POP macro. * testsuite/libgomp.c/atomic-18.c: New test. * testsuite/libgomp.c++/atomic-16.C: New test. --- gcc/c/c-parser.c.jj 2015-02-04 23:30:34.000000000 +0100 +++ gcc/c/c-parser.c 2015-02-11 12:16:31.274379159 +0100 @@ -6233,8 +6233,8 @@ c_parser_binary_expression (c_parser *pa if (__builtin_expect (omp_atomic_lhs != NULL_TREE, 0) && sp == 1 \ && c_parser_peek_token (parser)->type == CPP_SEMICOLON \ && ((1 << stack[sp].prec) \ - & (1 << (PREC_BITOR | PREC_BITXOR | PREC_BITAND | PREC_SHIFT \ - | PREC_ADD | PREC_MULT))) \ + & ((1 << PREC_BITOR) | (1 << PREC_BITXOR) | (1 << PREC_BITAND) \ + | (1 << PREC_SHIFT) | (1 << PREC_ADD) | (1 << PREC_MULT))) \ && stack[sp].op != TRUNC_MOD_EXPR \ && stack[0].expr.value != error_mark_node \ && stack[1].expr.value != error_mark_node \ --- libgomp/testsuite/libgomp.c/atomic-18.c.jj 2015-02-11 12:23:12.704648053 +0100 +++ libgomp/testsuite/libgomp.c/atomic-18.c 2015-02-11 12:24:11.749658560 +0100 @@ -0,0 +1,61 @@ +/* PR c/64824 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fopenmp" } */ + +void +f1 (void) +{ + short a; + short b = 1; + int c = 3; +#pragma omp atomic capture + a = b = c << b; + if (b != 6 || a != 6) + __builtin_abort (); +} + +void +f2 (void) +{ + short a; + short b = 1; + int c = 3; +#pragma omp atomic capture + a = b = c + b; + if (b != 4 || a != 4) + __builtin_abort (); +} + +void +f3 (void) +{ + short a; + short b = 1; + long long int c = 3; +#pragma omp atomic capture + a = b = c + b; + if (b != 4 || a != 4) + __builtin_abort (); +} + +void +f4 (void) +{ + char a; + char b = 1; + long long int c = 3LL; +#pragma omp atomic capture + a = b = c << b; + if (b != 6 || a != 6) + __builtin_abort (); +} + +int +main () +{ + f1 (); + f2 (); + f3 (); + f4 (); + return 0; +} --- libgomp/testsuite/libgomp.c++/atomic-16.C.jj 2015-02-11 12:24:03.337799529 +0100 +++ libgomp/testsuite/libgomp.c++/atomic-16.C 2015-02-11 12:23:58.019888648 +0100 @@ -0,0 +1,5 @@ +// PR c/64824 +// { dg-do run } +// { dg-options "-O2 -fopenmp" } + +#include "../libgomp.c/atomic-18.c" Jakub