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]

[PATCH] Fix thinko in safelen, simdlen and aligned clause parsing (PR c/67500)


Hi!

The first 3 hunks are quite obvious, of course we have to complain if any
of those conditions are non-zero, rather than only when all of them are
non-zero (which never happens).  The last hunk fixes ICE if
undeclared_variable is called during parsing of #pragma omp declare simd
clauses, where the error_mark_node ends up next to the parameters in the
binding.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk
and 5 branch.

2015-09-09  Jakub Jelinek  <jakub@redhat.com>

	PR c/67500
	* c-parser.c (c_parser_omp_clause_aligned,
	c_parser_omp_clause_safelen, c_parser_omp_clause_simdlen): Fix up
	test for errors.
	* c-decl.c (temp_pop_parm_decls): Allow b->decl equal to
	error_mark_node.

	* gcc.dg/gomp/pr67500.c: New test.

--- gcc/c/c-parser.c.jj	2015-09-08 16:33:43.000000000 +0200
+++ gcc/c/c-parser.c	2015-09-08 16:54:12.780354454 +0200
@@ -11231,9 +11231,9 @@ c_parser_omp_clause_aligned (c_parser *p
       tree alignment = c_parser_expr_no_commas (parser, NULL).value;
       mark_exp_read (alignment);
       alignment = c_fully_fold (alignment, false, NULL);
-      if (!INTEGRAL_TYPE_P (TREE_TYPE (alignment))
-	  && TREE_CODE (alignment) != INTEGER_CST
-	  && tree_int_cst_sgn (alignment) != 1)
+      if (TREE_CODE (alignment) != INTEGER_CST
+	  || !INTEGRAL_TYPE_P (TREE_TYPE (alignment))
+	  || tree_int_cst_sgn (alignment) != 1)
 	{
 	  error_at (clause_loc, "%<aligned%> clause alignment expression must "
 				"be positive constant integer expression");
@@ -11310,9 +11310,9 @@ c_parser_omp_clause_safelen (c_parser *p
   t = c_parser_expr_no_commas (parser, NULL).value;
   mark_exp_read (t);
   t = c_fully_fold (t, false, NULL);
-  if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
-      && TREE_CODE (t) != INTEGER_CST
-      && tree_int_cst_sgn (t) != 1)
+  if (TREE_CODE (t) != INTEGER_CST
+      || !INTEGRAL_TYPE_P (TREE_TYPE (t))
+      || tree_int_cst_sgn (t) != 1)
     {
       error_at (clause_loc, "%<safelen%> clause expression must "
 			    "be positive constant integer expression");
@@ -11346,9 +11346,9 @@ c_parser_omp_clause_simdlen (c_parser *p
   t = c_parser_expr_no_commas (parser, NULL).value;
   mark_exp_read (t);
   t = c_fully_fold (t, false, NULL);
-  if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
-      && TREE_CODE (t) != INTEGER_CST
-      && tree_int_cst_sgn (t) != 1)
+  if (TREE_CODE (t) != INTEGER_CST
+      || !INTEGRAL_TYPE_P (TREE_TYPE (t))
+      || tree_int_cst_sgn (t) != 1)
     {
       error_at (clause_loc, "%<simdlen%> clause expression must "
 			    "be positive constant integer expression");
--- gcc/c/c-decl.c.jj	2015-08-24 18:26:44.000000000 +0200
+++ gcc/c/c-decl.c	2015-09-08 17:04:37.659108598 +0200
@@ -8912,7 +8912,8 @@ temp_pop_parm_decls (void)
   current_scope->bindings = NULL;
   for (; b; b = free_binding_and_advance (b))
     {
-      gcc_assert (TREE_CODE (b->decl) == PARM_DECL);
+      gcc_assert (TREE_CODE (b->decl) == PARM_DECL
+		  || b->decl == error_mark_node);
       gcc_assert (I_SYMBOL_BINDING (b->id) == b);
       I_SYMBOL_BINDING (b->id) = b->shadowed;
       if (b->shadowed && b->shadowed->u.type)
--- gcc/testsuite/gcc.dg/gomp/pr67500.c.jj	2015-09-08 17:13:28.370270406 +0200
+++ gcc/testsuite/gcc.dg/gomp/pr67500.c	2015-09-08 17:13:35.400166580 +0200
@@ -0,0 +1,42 @@
+/* PR c/67500 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+#pragma omp declare simd simdlen(d)	/* { dg-error "clause expression must be positive constant integer expression" } */
+void f1 (int);				/* { dg-error "undeclared here" "" { target *-*-* } 5 } */
+#pragma omp declare simd simdlen(0.5)	/* { dg-error "clause expression must be positive constant integer expression" } */
+void f2 (int);
+#pragma omp declare simd simdlen(-2)	/* { dg-error "clause expression must be positive constant integer expression" } */
+void f3 (int);
+#pragma omp declare simd simdlen(0)	/* { dg-error "clause expression must be positive constant integer expression" } */
+void f4 (int);
+
+void
+foo (int *p)
+{
+  int i;
+  #pragma omp simd safelen(d)		/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)		/* { dg-error "undeclared" "" { target *-*-* } 18 } */
+    ;
+  #pragma omp simd safelen(0.5)		/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+  #pragma omp simd safelen(-2)		/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+  #pragma omp simd safelen(0)		/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+  #pragma omp simd aligned(p:d)		/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+  #pragma omp simd aligned(p:0.5)	/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+  #pragma omp simd aligned(p:-2)	/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+  #pragma omp simd aligned(p:0)		/* { dg-error "must be positive constant integer expression" } */
+  for (i = 0; i < 16; ++i)
+    ;
+}

	Jakub


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