]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix up #pragma omp declare {simd,variant} and acc routine parsing
authorJakub Jelinek <jakub@redhat.com>
Thu, 12 Aug 2021 09:09:00 +0000 (11:09 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Thu, 12 Aug 2021 09:09:00 +0000 (11:09 +0200)
When parsing default arguments, we need to temporarily clear parser->omp_declare_simd
and parser->oacc_routine, otherwise it can clash with further declarations
inside of e.g. lambdas inside of those default arguments.

2021-08-04  Jakub Jelinek  <jakub@redhat.com>

PR c++/101759
* parser.c (cp_parser_default_argument): Temporarily override
parser->omp_declare_simd and parser->oacc_routine to NULL.

* g++.dg/gomp/pr101759.C: New test.
* g++.dg/goacc/pr101759.C: New test.

(cherry picked from commit af31cab04770f7a1a1da069415ab62ca2ef54fc4)

gcc/cp/ChangeLog.omp
gcc/cp/parser.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/g++.dg/goacc/pr101759.C [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/pr101759.C [new file with mode: 0644]

index 8c1d85ba82a0644a22ba551528402812dace20a2..938110910942d5748f9b0980b81cb1e21552e9c1 100644 (file)
@@ -1,3 +1,12 @@
+2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-08-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/101759
+       * parser.c (cp_parser_default_argument): Temporarily override
+       parser->omp_declare_simd and parser->oacc_routine to NULL.
+
 2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
index 824c8288f405a0aa7a8dbcc98a0c4c0a8f654c53..b5192a4087508c948786280bc4b89d79f989729d 100644 (file)
@@ -24566,6 +24566,8 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
      set correctly.  */
   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
   parser->greater_than_is_operator_p = !template_parm_p;
+  auto odsd = make_temp_override (parser->omp_declare_simd, NULL);
+  auto ord = make_temp_override (parser->oacc_routine, NULL);
   /* Local variable names (and the `this' keyword) may not
      appear in a default argument.  */
   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
index bb0605f1918c71984d99f696df7776c293df76a4..a9aeb55a10a9d53d99380447434eb89d086f98c2 100644 (file)
@@ -1,3 +1,12 @@
+2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-08-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/101759
+       * g++.dg/gomp/pr101759.C: New test.
+       * g++.dg/goacc/pr101759.C: New test.
+
 2021-08-12  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
diff --git a/gcc/testsuite/g++.dg/goacc/pr101759.C b/gcc/testsuite/g++.dg/goacc/pr101759.C
new file mode 100644 (file)
index 0000000..522a5d4
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/101759
+// { dg-do compile { target c++11 } }
+
+#pragma acc routine
+int foo (int x = []() { extern int bar (int); return 1; }());
diff --git a/gcc/testsuite/g++.dg/gomp/pr101759.C b/gcc/testsuite/g++.dg/gomp/pr101759.C
new file mode 100644 (file)
index 0000000..905b875
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/101759
+// { dg-do compile { target c++11 } }
+
+#pragma omp declare simd
+int foo (int x = []() { extern int bar (int); return 1; }());
+int corge (int = 1);
+#pragma omp declare variant (corge) match (user={condition(true)})
+int baz (int x = []() { extern int qux (int); return 1; }());