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" }
+  }
+}

Reply via email to