Hi!

The following testcase ICEs, because we use write_unqualified_name to
write the type alias name.  Unfortunately, it is an alias for an unnamed
type and write_unqualified_name in that case uses
      if (TREE_CODE (decl) == TYPE_DECL
          && enum_with_enumerator_for_linkage_p (type))
        write_unnamed_enum_name (type);
      else if (TREE_CODE (decl) == TYPE_DECL && TYPE_UNNAMED_P (type))
        write_unnamed_type_name (type);
      else if (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (type))
        write_closure_type_name (type);
      else
        write_source_name (DECL_NAME (decl));
and write_unnamed_type_node
  else if (TYPE_CLASS_SCOPE_P (type))
    discriminator = nested_anon_class_index (type);
and nested_anon_class_index ICEs, because type is the type alias and
obviously it can't find a type alias among DECL_IMPLICIT_TYPEDEF_P nembers.
In this case, we really want to write the source name of the type alias
(which always should have DECL_NAME), regardless of what the dealias
of the type alias is (that is emitted later in the mangling).

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Note, this isn't the only PR against this area, there is another one where
write_prefix (decl_mangling_context (arg)); doesn't work properly for
local names.

2026-06-11  Jakub Jelinek  <[email protected]>

        PR c++/125680
        * mangle.cc (write_reflection): For type aliases use maybe_write_module
        and write_source_name instead of write_unqualified_name.

        * g++.dg/reflect/mangle8.C: New test.

--- gcc/cp/mangle.cc.jj 2026-05-30 17:45:09.368109989 +0200
+++ gcc/cp/mangle.cc    2026-06-10 10:59:34.208208674 +0200
@@ -4245,7 +4245,9 @@ write_reflection (tree refl)
         write_template_args, it shouldn't be
         remembered among substitutions.  */
       write_prefix (decl_mangling_context (arg));
-      write_unqualified_name (arg);
+      if (modules_p ())
+       maybe_write_module (arg);
+      write_source_name (DECL_NAME (arg));
       tree template_info = maybe_template_info (arg);
       if (template_info)
        write_template_args (TI_ARGS (template_info));
--- gcc/testsuite/g++.dg/reflect/mangle8.C.jj   2026-06-10 11:16:23.143869147 
+0200
+++ gcc/testsuite/g++.dg/reflect/mangle8.C      2026-06-10 11:19:50.389129484 
+0200
@@ -0,0 +1,32 @@
+// PR c++/125680
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+
+#include <meta>
+
+struct A { struct { int b; } a[4]; };
+
+template <std::meta::info I>
+struct B
+{
+  consteval static std::meta::info
+  foo ()
+  {
+    if constexpr (is_array_type (I))
+      {
+       using C = typename [: remove_extent (I) :];
+       return ^^C;
+      }
+    else
+      {
+        constexpr auto c = type_of (nonstatic_data_members_of (I, 
std::meta::access_context::current ())[0]);
+        using C = typename [: c :];
+        return ^^C;
+      }
+  }
+  constexpr static std::meta::info b = foo ();
+};
+
+constexpr auto a = B <^^A>::b;
+constexpr auto b = B <a>::b;
+constexpr auto c = B <b>::b;

        Jakub

Reply via email to