]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/64824 (ICE in gimple verification)
authorJakub Jelinek <jakub@redhat.com>
Wed, 11 Feb 2015 14:48:41 +0000 (15:48 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 11 Feb 2015 14:48:41 +0000 (15:48 +0100)
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.

From-SVN: r220624

gcc/c/ChangeLog
gcc/c/c-parser.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c++/atomic-16.C [new file with mode: 0644]
libgomp/testsuite/libgomp.c/atomic-18.c [new file with mode: 0644]

index 972ea3572796788a54c14a1e9cdda871944c168c..00c54492d6a7179eb5f3c09d42704d98f49da0c4 100644 (file)
@@ -1,5 +1,9 @@
 2015-02-11  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c/64824
+       * c-parser.c (c_parser_binary_expression): Fix OpenMP stack[sp].prec
+       check in the POP macro.
+
        Backported from mainline
        2015-02-04  Jakub Jelinek  <jakub@redhat.com>
 
index 66a9a16c7a80e4dbffd4a58c5868ddd1c598b58f..09e7a28dcee2126509f0c311ccad9608382b0ed2 100644 (file)
@@ -6103,8 +6103,8 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after,
     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                             \
index 39f693d8d55435f3d97a84dc26d6e5b605398711..c1a983a5094ed7e960a62548fd70debe7ccf51d6 100644 (file)
@@ -1,5 +1,9 @@
 2015-02-11  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c/64824
+       * testsuite/libgomp.c/atomic-18.c: New test.
+       * testsuite/libgomp.c++/atomic-16.C: New test.
+
        Backported from mainline
        2015-02-04  Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/libgomp/testsuite/libgomp.c++/atomic-16.C b/libgomp/testsuite/libgomp.c++/atomic-16.C
new file mode 100644 (file)
index 0000000..afccd52
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c/64824
+// { dg-do run }
+// { dg-options "-O2 -fopenmp" }
+
+#include "../libgomp.c/atomic-18.c"
diff --git a/libgomp/testsuite/libgomp.c/atomic-18.c b/libgomp/testsuite/libgomp.c/atomic-18.c
new file mode 100644 (file)
index 0000000..bd048c1
--- /dev/null
@@ -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;
+}