]> 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>
Wed, 4 Aug 2021 09:53:48 +0000 (11:53 +0200)
committerJakub Jelinek <jakub@redhat.com>
Thu, 12 Aug 2021 20:54:19 +0000 (22:54 +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/parser.c
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 f16b45c37a0f26cc44800457a398e9cd0869f55f..f7632142697980bd6158a1f21b6b4a668d00ed7e 100644 (file)
@@ -24046,6 +24046,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;
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; }());