Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
-- >8 --
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.
---
gcc/cp/parser.cc | 9 +++++++--
gcc/testsuite/g++.dg/reflect/error14.C | 15 +++++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/reflect/error14.C
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 8194106c6e9..aeff4535337 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 00000000000..e525ac92832
--- /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" }
+ }
+}
base-commit: 33e4cfbd9495a23ffe4639c217442a5459b9e400
--
2.54.0