This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/67495] New: #pragma omp atomic ICEs
- From: "jakub at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 08 Sep 2015 14:24:57 +0000
- Subject: [Bug c/67495] New: #pragma omp atomic ICEs
- Auto-submitted: auto-generated
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.