Hi!

I found a bug in OpenMP 5.0 examples that GCC didn't flag as an error.
The following patch implements the missing diagnostics.

Bootstrapped/regtested on powerpc64le-linux, committed to trunk.

2019-11-11  Jakub Jelinek  <ja...@redhat.com>

        * c-parser.c (c_parser_translation_unit): Diagnose declare target
        without corresponding end declare target.

        * semantics.c (finish_translation_unit): Diagnose declare target
        without corresponding end declare target.

        * c-c++-common/gomp/declare-target-5.c: New test.

--- gcc/c/c-parser.c.jj 2019-11-08 09:03:56.271250390 +0100
+++ gcc/c/c-parser.c    2019-11-11 11:09:46.910702347 +0100
@@ -1554,6 +1554,14 @@ c_parser_translation_unit (c_parser *par
   FOR_EACH_VEC_ELT (incomplete_record_decls, i, decl)
     if (DECL_SIZE (decl) == NULL_TREE && TREE_TYPE (decl) != error_mark_node)
       error ("storage size of %q+D isn%'t known", decl);
+
+  if (current_omp_declare_target_attribute)
+    {
+      if (!errorcount)
+        error ("%<#pragma omp declare target%> without corresponding "
+              "%<#pragma omp end declare target%>");
+      current_omp_declare_target_attribute = 0;
+    }
 }
 
 /* Parse an external declaration (C90 6.7, C99 6.9, C11 6.9).
--- gcc/cp/semantics.c.jj       2019-11-02 00:26:48.932847353 +0100
+++ gcc/cp/semantics.c  2019-11-11 11:29:55.009396475 +0100
@@ -3048,6 +3048,14 @@ finish_translation_unit (void)
 
   /* Do file scope __FUNCTION__ et al.  */
   finish_fname_decls ();
+
+  if (scope_chain->omp_declare_target_attribute)
+    {
+      if (!errorcount)
+       error ("%<#pragma omp declare target%> without corresponding "
+              "%<#pragma omp end declare target%>");
+      scope_chain->omp_declare_target_attribute = 0;
+    }
 }
 
 /* Finish a template type parameter, specified as AGGR IDENTIFIER.
--- gcc/testsuite/c-c++-common/gomp/declare-target-5.c.jj       2019-11-11 
11:11:04.577524594 +0100
+++ gcc/testsuite/c-c++-common/gomp/declare-target-5.c  2019-11-11 
11:18:40.289619051 +0100
@@ -0,0 +1,2 @@
+#pragma omp declare target
+void foo (void);       /* { dg-error "'#pragma omp declare target' without 
corresponding '#pragma omp end declare target'" } */

        Jakub

Reply via email to