Hi!

On Fri, Dec 12, 2025 at 09:39:18AM -0500, Patrick Palka wrote:
> +      TREE_TYPE (templ)
> +     = build_typename_type (TYPE_CONTEXT (TREE_TYPE (templ)),
> +                            TYPE_NAME (TREE_TYPE (templ)),
> +                            fullname,
> +                            get_typename_type_tag (TREE_TYPE (templ)));
>        template_id = templ;
>      }
>    else

This change causes ICE e.g. on the following testcase.

The problem is that build_typename_type expects IDENTIFIER_NODE as the
second argument, e.g. it uses it as
      tree d = build_decl (input_location, TYPE_DECL, name, t);
argument.  But TYPE_NAME doesn't have to be an IDENTIFIER_NODE, it can
be a TYPE_DECL too and when we build a TYPE_DECL with TYPE_DECL as
DECL_NAME, it breaks all kinds of assumptions everywhere in the FE as well
as middle-end.

Fixed by using TYPE_IDENTIFIER instead.

So far bootstrapped successfully on x86_64-linux and i686-linux, ok
for trunk if it passes also regtest on both (in progress)?

2025-12-18  Jakub Jelinek  <[email protected]>

        PR c++/123186
        * parser.cc (cp_parser_template_id): Use TYPE_IDENTIFIER instead of
        TYPE_NAME in second build_typename_type argument.

        * g++.dg/template/crash133.C: New test.

--- gcc/cp/parser.cc.jj 2025-12-17 15:21:21.045719368 +0100
+++ gcc/cp/parser.cc    2025-12-18 11:11:56.074952675 +0100
@@ -20435,7 +20435,7 @@ cp_parser_template_id (cp_parser *parser
                                   fullname, arguments);
       TREE_TYPE (templ)
        = build_typename_type (TYPE_CONTEXT (TREE_TYPE (templ)),
-                              TYPE_NAME (TREE_TYPE (templ)),
+                              TYPE_IDENTIFIER (TREE_TYPE (templ)),
                               fullname,
                               get_typename_tag (TREE_TYPE (templ)));
       template_id = templ;
--- gcc/testsuite/g++.dg/template/crash133.C.jj 2025-12-18 13:22:56.797502427 
+0100
+++ gcc/testsuite/g++.dg/template/crash133.C    2025-12-18 13:22:49.365630906 
+0100
@@ -0,0 +1,6 @@
+// PR c++/123186
+
+template <class T>
+struct A : T {
+  typename A <T>::template B <42> C;
+};


        Jakub

Reply via email to