public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/omp/gcc-11] openmp: Diagnose syntax mismatches between declare target and end declare target
@ 2021-08-12 10:00 Tobias Burnus
  0 siblings, 0 replies; only message in thread
From: Tobias Burnus @ 2021-08-12 10:00 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:b497d6da00fc71947e47124a27fbf5028d9863be

commit b497d6da00fc71947e47124a27fbf5028d9863be
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Aug 12 11:25:26 2021 +0200

    openmp: Diagnose syntax mismatches between declare target and end declare target
    
    OpenMP 5.1 says:
    For any directive that has a paired end directive, including those with a begin
    and end pair, both directives must use either the attribute syntax or the
    pragma syntax.
    
    The following patch enforces it with the only pair so far recognized in C++
    (Fortran has many, but on the other side doesn't have attribute syntax).
    
    While I initially wanted to use vec<bool, va_gc> *member; in there, that
    unfortunately doesn't work, one gets linker errors and I guess it is fixable,
    but for begin declare target we'll need a struct anyway to store device_type
    etc.
    
    2021-08-12  Jakub Jelinek  <jakub@redhat.com>
    
            * cp-tree.h (omp_declare_target_attr): New type.
            (struct saved_scope): Change type of omp_declare_target_attribute
            from int to vec<omp_declare_target_attr, va_gc> * and move it.
            * parser.c (cp_parser_omp_declare_target): Instead of
            incrementing scope_chain->omp_declare_target_attribute, push
            a struct containing parser->lexer->in_omp_attribute_pragma to
            the vector.
            (cp_parser_omp_end_declare_target): Instead of decrementing
            scope_chain->omp_declare_target_attribute, pop a structure
            from it.  Diagnose mismatching declare target vs.
            end declare target syntax.
            * semantics.c (finish_translation_unit): Use vec_safe_length
            and vec_safe_truncate on scope_chain->omp_declare_target_attributes.
            * decl2.c (cplus_decl_attributes): Use vec_safe_length
            on scope_chain->omp_declare_target_attributes.
    
            * g++.dg/gomp/attrs-12.C: New test.
    
    (cherry picked from commit 01f8a8b48e50cbaa68b878d9f8a330b8c0736bed)

Diff:
---
 gcc/cp/ChangeLog.omp                 | 21 ++++++++++++++++++
 gcc/cp/cp-tree.h                     |  8 ++++---
 gcc/cp/decl2.c                       |  2 +-
 gcc/cp/parser.c                      | 23 +++++++++++++++++---
 gcc/cp/semantics.c                   |  4 ++--
 gcc/testsuite/ChangeLog.omp          |  7 ++++++
 gcc/testsuite/g++.dg/gomp/attrs-12.C | 41 ++++++++++++++++++++++++++++++++++++
 7 files changed, 97 insertions(+), 9 deletions(-)

diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp
index 1daae13533a..b2a41e15f9d 100644
--- a/gcc/cp/ChangeLog.omp
+++ b/gcc/cp/ChangeLog.omp
@@ -1,3 +1,24 @@
+2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
+
+	Backported from master:
+	2021-08-12  Jakub Jelinek  <jakub@redhat.com>
+
+	* cp-tree.h (omp_declare_target_attr): New type.
+	(struct saved_scope): Change type of omp_declare_target_attribute
+	from int to vec<omp_declare_target_attr, va_gc> * and move it.
+	* parser.c (cp_parser_omp_declare_target): Instead of
+	incrementing scope_chain->omp_declare_target_attribute, push
+	a struct containing parser->lexer->in_omp_attribute_pragma to
+	the vector.
+	(cp_parser_omp_end_declare_target): Instead of decrementing
+	scope_chain->omp_declare_target_attribute, pop a structure
+	from it.  Diagnose mismatching declare target vs.
+	end declare target syntax.
+	* semantics.c (finish_translation_unit): Use vec_safe_length
+	and vec_safe_truncate on scope_chain->omp_declare_target_attributes.
+	* decl2.c (cplus_decl_attributes): Use vec_safe_length
+	on scope_chain->omp_declare_target_attributes.
+
 2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
 
 	Backported from master:
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 792ee932471..c1b49fa7707 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -1764,6 +1764,10 @@ union GTY((desc ("cp_tree_node_structure (&%h)"),
 };
 
 \f
+struct GTY(()) omp_declare_target_attr {
+  bool attr_syntax;
+};
+
 /* Global state.  */
 
 struct GTY(()) saved_scope {
@@ -1798,9 +1802,6 @@ struct GTY(()) saved_scope {
   int unevaluated_operand;
   int inhibit_evaluation_warnings;
   int noexcept_operand;
-  /* If non-zero, implicit "omp declare target" attribute is added into the
-     attribute lists.  */
-  int omp_declare_target_attribute;
   int ref_temp_count;
 
   struct stmt_tree_s x_stmt_tree;
@@ -1809,6 +1810,7 @@ struct GTY(()) saved_scope {
   cp_binding_level *bindings;
 
   hash_map<tree, tree> *GTY((skip)) x_local_specializations;
+  vec<omp_declare_target_attr, va_gc> *omp_declare_target_attribute;
 
   struct saved_scope *prev;
 };
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index f32c0f830b0..cf433acde65 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1550,7 +1550,7 @@ cplus_decl_attributes (tree *decl, tree attributes, int flags)
     return;
 
   /* Add implicit "omp declare target" attribute if requested.  */
-  if (scope_chain->omp_declare_target_attribute
+  if (vec_safe_length (scope_chain->omp_declare_target_attribute)
       && ((VAR_P (*decl)
 	   && (TREE_STATIC (*decl) || DECL_EXTERNAL (*decl)))
 	  || TREE_CODE (*decl) == FUNCTION_DECL))
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 88415805aa3..aeaa4f5bd06 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -44432,8 +44432,10 @@ cp_parser_omp_declare_target (cp_parser *parser, cp_token *pragma_tok)
     }
   else
     {
+      struct omp_declare_target_attr a
+	= { parser->lexer->in_omp_attribute_pragma };
+      vec_safe_push (scope_chain->omp_declare_target_attribute, a);
       cp_parser_require_pragma_eol (parser, pragma_tok);
-      scope_chain->omp_declare_target_attribute++;
       return;
     }
   for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
@@ -44514,6 +44516,7 @@ static void
 cp_parser_omp_end_declare_target (cp_parser *parser, cp_token *pragma_tok)
 {
   const char *p = "";
+  bool in_omp_attribute_pragma = parser->lexer->in_omp_attribute_pragma;
   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
     {
       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
@@ -44544,12 +44547,26 @@ cp_parser_omp_end_declare_target (cp_parser *parser, cp_token *pragma_tok)
       return;
     }
   cp_parser_require_pragma_eol (parser, pragma_tok);
-  if (!scope_chain->omp_declare_target_attribute)
+  if (!vec_safe_length (scope_chain->omp_declare_target_attribute))
     error_at (pragma_tok->location,
 	      "%<#pragma omp end declare target%> without corresponding "
 	      "%<#pragma omp declare target%>");
   else
-    scope_chain->omp_declare_target_attribute--;
+    {
+      omp_declare_target_attr
+	a = scope_chain->omp_declare_target_attribute->pop ();
+      if (a.attr_syntax != in_omp_attribute_pragma)
+	{
+	  if (a.attr_syntax)
+	    error_at (pragma_tok->location,
+		      "%<declare target%> in attribute syntax terminated "
+		      "with %<end declare target%> in pragma syntax");
+	  else
+	    error_at (pragma_tok->location,
+		      "%<declare target%> in pragma syntax terminated "
+		      "with %<end declare target%> in attribute syntax");
+	}
+    }
 }
 
 /* Helper function of cp_parser_omp_declare_reduction.  Parse the combiner
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index ec4ec509b18..e412338922e 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -3213,12 +3213,12 @@ finish_translation_unit (void)
   /* Do file scope __FUNCTION__ et al.  */
   finish_fname_decls ();
 
-  if (scope_chain->omp_declare_target_attribute)
+  if (vec_safe_length (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;
+      vec_safe_truncate (scope_chain->omp_declare_target_attribute, 0);
     }
 }
 
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index a8f0c77b003..802ca90127d 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,10 @@
+2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
+
+	Backported from master:
+	2021-08-12  Jakub Jelinek  <jakub@redhat.com>
+
+	* g++.dg/gomp/attrs-12.C: New test.
+
 2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
 
 	Backported from master:
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-12.C b/gcc/testsuite/g++.dg/gomp/attrs-12.C
new file mode 100644
index 00000000000..b613872952e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/attrs-12.C
@@ -0,0 +1,41 @@
+// { dg-do compile { target c++11 } }
+
+#pragma omp declare target
+#pragma omp declare target
+[[omp::directive (declare target)]];
+int a;
+[[omp::directive (end declare target)]];
+#pragma omp end declare target
+#pragma omp end declare target
+[[omp::directive (declare target)]];
+int b;
+#pragma omp end declare target		// { dg-error "'declare target' in attribute syntax terminated with 'end declare target' in pragma syntax" }
+#pragma omp declare target
+int c;
+[[omp::directive (end declare target)]];// { dg-error "'declare target' in pragma syntax terminated with 'end declare target' in attribute syntax" }
+#pragma omp declare target
+[[omp::directive (declare target)]];
+int d;
+#pragma omp end declare target		// { dg-error "'declare target' in attribute syntax terminated with 'end declare target' in pragma syntax" }
+#pragma omp declare target
+int e;
+[[omp::directive (end declare target)]];// { dg-error "'declare target' in pragma syntax terminated with 'end declare target' in attribute syntax" }
+#pragma omp end declare target
+[[omp::directive (declare target)]];
+[[omp::directive (declare target)]];
+int f;
+#pragma omp end declare target		// { dg-error "'declare target' in attribute syntax terminated with 'end declare target' in pragma syntax" }
+#pragma omp declare target
+int g;
+[[omp::directive (end declare target)]];// { dg-error "'declare target' in pragma syntax terminated with 'end declare target' in attribute syntax" }
+[[omp::directive (end declare target)]];
+[[omp::directive (declare target)]];
+#pragma omp declare target
+int h;
+#pragma omp end declare target
+#pragma omp end declare target		// { dg-error "'declare target' in attribute syntax terminated with 'end declare target' in pragma syntax" }
+#pragma omp declare target
+[[omp::directive (declare target)]];
+int i;
+[[omp::directive (end declare target)]];
+[[omp::directive (end declare target)]];// { dg-error "'declare target' in pragma syntax terminated with 'end declare target' in attribute syntax" }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-08-12 10:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-12 10:00 [gcc/devel/omp/gcc-11] openmp: Diagnose syntax mismatches between declare target and end declare target Tobias Burnus

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).