https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67495
Bug ID: 67495 Summary: #pragma omp atomic ICEs Product: gcc Version: 5.2.1 Status: UNCONFIRMED Keywords: ice-on-invalid-code, openmp Severity: normal Priority: P3 Component: c Assignee: jakub at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- int a, b, c; void foo (void) { #pragma omp atomic capture a = (float)a + b;/* { dg-do error "invalid operator" } */ #pragma omp atomic read (float) a = b;/* { dg-do error "lvalue required" } */ #pragma omp atomic write (float) a = b;/* { dg-do error "lvalue required" } */ #pragma omp atomic read a = (float) b;/* { dg-do error "lvalue required" } */ #pragma omp atomic capture (float) a = b += c;/* { dg-do error "lvalue required" } */ #pragma omp atomic capture { a += b; (float) c = a; }/* { dg-do error "lvalue required" } */ #pragma omp atomic capture { a += b; c = (float) a; }/* { dg-do error "uses two different expressions for memory" } */ #pragma omp atomic capture a = (int)a + b;/* { dg-do error "invalid operator" } */ #pragma omp atomic read (int) a = b;/* { dg-do error "lvalue required" } */ #pragma omp atomic write (int) a = b;/* { dg-do error "lvalue required" } */ #pragma omp atomic read a = (int) b;/* { dg-do error "lvalue required" } */ #pragma omp atomic capture (int) a = b += c;/* { dg-do error "lvalue required" } */ #pragma omp atomic capture { a += b; (int) c = a; }/* { dg-do error "lvalue required" } */ #pragma omp atomic capture { a += b; c = (int) a; }/* { dg-do error "lvalue required" } */ } shows various ICEs, the common problem is that the C FE (unlike the C++ one) relies on c_parser_unary_expression to be called only from c_parser_cast_expression or from places which guarantee that there isn't a cast expression in the source code (that is the case of sizeof or __alignof__). c_parser_omp_atomic uses c_parser_unary_expression in lots of places, and does not guarantee that.