This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c/67495] New: #pragma omp atomic ICEs


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]