]> git.feebdaed.xyz Git - 0xmirror/gcc.git/commit
c++: Fix up recent cp_parser_template_id regression [PR123186]
authorJakub Jelinek <jakub@redhat.com>
Thu, 18 Dec 2025 15:41:10 +0000 (16:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 18 Dec 2025 15:41:10 +0000 (16:41 +0100)
commit1c555ba67a34ced2460a065eac05ae2e2693ca4d
tree7d965bee4dcc9b4b6575882a786bdc89bf5a1e29
parenta0908b6723128799a68c9fdab65f65761f657488
c++: Fix up recent cp_parser_template_id regression [PR123186]

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.

2025-12-18  Jakub Jelinek  <jakub@redhat.com>

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
gcc/testsuite/g++.dg/template/crash133.C [new file with mode: 0644]