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