aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/decl2.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-08-12 09:26:27 +0200
committerJakub Jelinek <jakub@redhat.com>2021-08-12 09:34:16 +0200
commit01f8a8b48e50cbaa68b878d9f8a330b8c0736bed (patch)
treeb07d5d4e0f30c9177afdb77c60e6922ec600f64c /gcc/cp/decl2.c
parentef07b918a7ad4f64e0e1e3db21d861f2e79de92a (diff)
downloadgcc-01f8a8b48e50cbaa68b878d9f8a330b8c0736bed.zip
gcc-01f8a8b48e50cbaa68b878d9f8a330b8c0736bed.tar.gz
gcc-01f8a8b48e50cbaa68b878d9f8a330b8c0736bed.tar.bz2
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.
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r--gcc/cp/decl2.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index ba27388..0c9d2f4 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1551,7 +1551,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))