On Thu, 18 Dec 2025, Jakub Jelinek wrote:

> 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.

OK by me

> 
> --- 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