diff mbox

Fix error recovery on invalid OpenMP clauses (PR c/67501)

Message ID 20150909074422.GH1847@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Sept. 9, 2015, 7:44 a.m. UTC
Hi!

If some OpenMP clause is parsed including the argument, such that
OMP_CLAUSE tree is created, but there is some error afterwards,
the C FE fails to remove the clause if it is not allowed for the
current construct, which results in ICEs later on (e.g. during
clause splitting).  While it would be enough to just remove the
clause in this case (clauses = prev;), for consistency with the
C++ FE I've decided to also emit the diagnostics that the
clause is not valid for the construct.

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/67501
	* c-parser.c (c_parser_oacc_all_clauses,
	c_parser_omp_all_clauses): Remove invalid clause from
	list of clauses even if parser->error is set.

	* c-c++-common/gomp/pr67501.c: New test.


	Jakub
diff mbox

Patch

--- gcc/c/c-parser.c.jj	2015-09-08 16:54:12.000000000 +0200
+++ gcc/c/c-parser.c	2015-09-08 17:41:32.134418742 +0200
@@ -11752,7 +11752,7 @@  c_parser_oacc_all_clauses (c_parser *par
 
       first = false;
 
-      if (((mask >> c_kind) & 1) == 0 && !parser->error)
+      if (((mask >> c_kind) & 1) == 0)
 	{
 	  /* Remove the invalid clause(s) from the list to avoid
 	     confusing the rest of the compiler.  */
@@ -11981,7 +11981,7 @@  c_parser_omp_all_clauses (c_parser *pars
 
       first = false;
 
-      if (((mask >> c_kind) & 1) == 0 && !parser->error)
+      if (((mask >> c_kind) & 1) == 0)
 	{
 	  /* Remove the invalid clause(s) from the list to avoid
 	     confusing the rest of the compiler.  */
--- gcc/testsuite/c-c++-common/gomp/pr67501.c.jj	2015-09-08 17:42:53.624215866 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr67501.c	2015-09-08 17:42:19.000000000 +0200
@@ -0,0 +1,12 @@ 
+/* PR c/67501 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (void)
+{
+  int i, j;
+  #pragma omp for simd copyprivate(j	/* { dg-error "before end of line" } */
+  for (i = 0; i < 16; ++i)		/* { dg-error "is not valid for" "" { target *-*-* } 9 } */
+    ;
+}