https://gcc.gnu.org/g:e797f09f8bdd680620da04d925ee429ed3201e07
commit r17-1862-ge797f09f8bdd680620da04d925ee429ed3201e07 Author: Marek Polacek <[email protected]> Date: Wed Jun 24 15:59:28 2026 -0400 c++/reflection: ^^ cannot define types [PR125922] The reflect-expression production uses "^^ type-id" which doesn't allow defining types (it's not defining-type-id), but we aren't checking this. PR c++/125922 gcc/cp/ChangeLog: * parser.cc (cp_parser_reflect_expression): Temporarily set parser->type_definition_forbidden_message. gcc/testsuite/ChangeLog: * g++.dg/reflect/error14.C: New test. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/parser.cc | 9 +++++++-- gcc/testsuite/g++.dg/reflect/error14.C | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 8194106c6e93..aeff45353372 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -10147,8 +10147,13 @@ cp_parser_reflect_expression (cp_parser *parser) cp_parser_parse_tentatively (parser); bool type_alias_p; - t = cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_NONE, false, false, - nullptr, &type_alias_p); + { + auto tdfm = + make_temp_override (parser->type_definition_forbidden_message, + G_("types may not be defined in %<^^%> expression")); + t = cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_NONE, false, false, + nullptr, &type_alias_p); + } if (cp_parser_parse_definitely (parser)) { /* With using A = int; ^^A is a type alias but ^^const A or ^^A & or diff --git a/gcc/testsuite/g++.dg/reflect/error14.C b/gcc/testsuite/g++.dg/reflect/error14.C new file mode 100644 index 000000000000..e525ac928323 --- /dev/null +++ b/gcc/testsuite/g++.dg/reflect/error14.C @@ -0,0 +1,15 @@ +// PR c++/125922 +// { dg-do compile { target c++26 } } +// { dg-additional-options "-freflection" } + +void +f () +{ + consteval { + (void) ^^struct { }; // { dg-error "types may not be defined" } + (void) ^^struct S { }; // { dg-error "types may not be defined" } + (void) ^^struct A { struct B { }; }; // { dg-error "types may not be defined" } + (void) ^^enum E { }; // { dg-error "types may not be defined" } + (void) ^^union U { }; // { dg-error "types may not be defined" } + } +}
