This is the mail archive of the gcc-patches@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]

[committed] Reject invalid #pragma omp declare simd in the C FE


Hi!

Unlike C++, C doesn't allow function declarations inside of if/while/for
body without {}s around, or after a label, while with #pragma omp declare simd
in between and -fopenmp it would happily accept it.  That is wrong, the
presence/absence of OpenMP pragmas shouldn't change parsing that way.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk.

2017-11-23  Jakub Jelinek  <jakub@redhat.com>

	* c-parser.c (c_parser_omp_declare_simd): Reject declare simd in
	pragma_stmt context.

	* gcc.dg/gomp/declare-simd-1.c (f9): Remove.
	* gcc.dg/gomp/declare-simd-5.c: New test.

--- gcc/c/c-parser.c.jj	2017-11-20 19:55:39.000000000 +0100
+++ gcc/c/c-parser.c	2017-11-23 17:43:51.623042138 +0100
@@ -17483,11 +17483,11 @@ c_parser_omp_declare_simd (c_parser *par
       break;
     case pragma_struct:
     case pragma_param:
+    case pragma_stmt:
       c_parser_error (parser, "%<#pragma omp declare simd%> must be followed by "
 			      "function declaration or definition");
       break;
     case pragma_compound:
-    case pragma_stmt:
       if (c_parser_next_token_is (parser, CPP_KEYWORD)
 	  && c_parser_peek_token (parser)->keyword == RID_EXTENSION)
 	{
--- gcc/testsuite/gcc.dg/gomp/declare-simd-1.c.jj	2016-04-06 14:46:29.000000000 +0200
+++ gcc/testsuite/gcc.dg/gomp/declare-simd-1.c	2017-11-23 17:46:04.914434577 +0100
@@ -58,18 +58,6 @@ f7 (int x)
 /* { dg-final { scan-assembler-times "_ZGVeM16v_f7:" 1 { target { i?86-*-* x86_64-*-* } } } } */
 /* { dg-final { scan-assembler-times "_ZGVeN16v_f7:" 1 { target { i?86-*-* x86_64-*-* } } } } */
 
-int
-f9 (int x)
-{
-  if (x)
-    #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
-    extern int f10 (int a, int *b, int c);
-  while (x < 10)
-    #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
-    extern int f11 (int a, int *b, int c);
-  return x;
-}
-
 #pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8)
 int f12 (int c; int *b; int a; int a, int *b, int c);
 
--- gcc/testsuite/gcc.dg/gomp/declare-simd-5.c.jj	2017-11-23 17:47:01.886747780 +0100
+++ gcc/testsuite/gcc.dg/gomp/declare-simd-5.c	2017-11-23 17:51:10.749747753 +0100
@@ -0,0 +1,35 @@
+/* Test parsing of #pragma omp declare simd */
+/* { dg-do compile } */
+
+int
+f1 (int x)
+{
+  if (x)
+    #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+    extern int f3 (int a, int *b, int c);	/* { dg-error "must be followed by function declaration or definition" } */
+  while (x < 10)
+    #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+    extern int f4 (int a, int *b, int c);	/* { dg-error "must be followed by function declaration or definition" } */
+  {
+lab:
+    #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int))
+    extern int f5 (int a, int *b, int c);	/* { dg-error "must be followed by function declaration or definition" } */
+    x++;					/* { dg-error "expected expression before" "" { target *-*-* } .-1 } */
+  }
+  return x;
+}
+
+int
+f2 (int x)
+{
+  if (x)
+    extern int f6 (int a, int *b, int c);	/* { dg-error "expected expression before" } */
+  while (x < 10)
+    extern int f7 (int a, int *b, int c);	/* { dg-error "expected expression before" } */
+  {
+lab:
+    extern int f8 (int a, int *b, int c);	/* { dg-error "a label can only be part of a statement and a declaration is not a statement" } */
+    x++;
+  }
+  return x;
+}

	Jakub


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