From: Odysseas Georgoudis Date: Fri, 24 Jul 2026 19:17:32 +0000 (-0400) Subject: c++: Fix ICE with loop pragmas at class scope [PR126323] X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cd453025faf5ab3ada2428e5fc372d9a6328c9cb;p=thirdparty%2Fgcc.git c++: Fix ICE with loop pragmas at class scope [PR126323] 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 --- diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 3f042bec1c6..13ebd64c483 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -57597,7 +57597,7 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p) 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", diff --git a/gcc/testsuite/g++.dg/parse/pr126323.C b/gcc/testsuite/g++.dg/parse/pr126323.C new file mode 100644 index 00000000000..2224733ccb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr126323.C @@ -0,0 +1,10 @@ +// 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 } + ; +};