cp_parser_pragma rejected GCC loop pragmas at namespace scope, but not
at class scope. Consequently, it attempted to parse the following loop
as a statement while in a member-declaration context, leading to an ICE
when processing the loop initializer.
Accept these pragmas only in statement contexts.
gcc/cp/ChangeLog:
PR c++/126323
* parser.cc (cp_parser_pragma): Reject GCC loop pragmas outside
statement contexts.
gcc/testsuite/ChangeLog:
PR c++/126323
* g++.dg/parse/pr126323.C: New test.
Reviewed-by: Jason Merrill <jason@redhat.com>
gcc_unreachable ();
}
- if (context == pragma_external)
+ if (context != pragma_stmt && context != pragma_compound)
{
error_at (pragma_tok->location,
"%<#pragma GCC %s%> must be inside a function",
--- /dev/null
+// PR c++/126323
+
+class C {
+#pragma GCC novector // { dg-error "must be inside a function" }
+#pragma GCC unroll(0) // { dg-error "must be inside a function" }
+#pragma GCC ivdep // { dg-error "must be inside a function" }
+ for (int i = 0; i < 2; i++) // { dg-error "expected unqualified-id" }
+ // { dg-error "does not name a type" "" { target *-*-* } .-1 }
+ ;
+};