aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-07-31 09:35:25 +0200
committerJakub Jelinek <jakub@redhat.com>2021-07-31 09:35:25 +0200
commit05bcef5a88b34dd13179cabbe902e9135cb40ffe (patch)
treea89441dc67c96a6c5a881c6fe2615a666f1963ce
parent91425e2adecd00091d7443104ecb367686e88663 (diff)
downloadgcc-05bcef5a88b34dd13179cabbe902e9135cb40ffe.zip
gcc-05bcef5a88b34dd13179cabbe902e9135cb40ffe.tar.gz
gcc-05bcef5a88b34dd13179cabbe902e9135cb40ffe.tar.bz2
openmp: Handle OpenMP directives in attribute syntax in attribute-declaration
Now that we parse attribute-declaration (outside of functions), the following patch handles OpenMP directives in its attribute(s). What needs handling incrementally is diagnose mismatching begin/end pair like [[omp::directive (declare target)]]; int a; #pragma omp end declare target or #pragma omp declare target int b; [[omp::directive (end declare target)]]; and handling declare simd/declare variant on declarations (function definitions and declarations), for those in two different spots. 2021-07-31 Jakub Jelinek <jakub@redhat.com> * parser.c (cp_parser_declaration): Handle OpenMP directives in attribute-declaration. * g++.dg/gomp/attrs-9.C: New test.
-rw-r--r--gcc/cp/parser.c19
-rw-r--r--gcc/testsuite/g++.dg/gomp/attrs-9.C15
2 files changed, 34 insertions, 0 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index ab74e9d..47bf7d9 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -14431,6 +14431,25 @@ cp_parser_declaration (cp_parser* parser, tree prefix_attrs)
{
location_t attrs_loc = token1->location;
tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
+
+ if (std_attrs && (flag_openmp || flag_openmp_simd))
+ {
+ gcc_assert (!parser->lexer->in_omp_attribute_pragma);
+ std_attrs = cp_parser_handle_statement_omp_attributes (parser,
+ std_attrs);
+ if (parser->lexer->in_omp_attribute_pragma)
+ {
+ cp_lexer *lexer = parser->lexer;
+ while (parser->lexer->in_omp_attribute_pragma)
+ {
+ gcc_assert (cp_lexer_next_token_is (parser->lexer,
+ CPP_PRAGMA));
+ cp_parser_pragma (parser, pragma_external, NULL);
+ }
+ cp_lexer_destroy (lexer);
+ }
+ }
+
if (std_attrs != NULL_TREE)
warning_at (make_location (attrs_loc, attrs_loc, parser->lexer),
OPT_Wattributes, "attribute ignored");
diff --git a/gcc/testsuite/g++.dg/gomp/attrs-9.C b/gcc/testsuite/g++.dg/gomp/attrs-9.C
new file mode 100644
index 0000000..0af556c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/attrs-9.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++11 } }
+
+[[omp::sequence (directive (requires, atomic_default_mem_order (seq_cst)))]];
+[[omp::directive (declare reduction (plus: int: omp_out += omp_in) initializer (omp_priv = 0))]];
+int a;
+[[omp::directive (declare target (a))]];
+int t;
+[[omp::sequence (omp::directive (threadprivate (t)))]];
+int b, c;
+[[omp::directive (declare target, to (b), link (c))]];
+[[omp::directive (declare target)]];
+[[omp::directive (declare target)]];
+int d;
+[[omp::directive (end declare target)]];
+[[omp::directive (end declare target)]];