]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: ICE with TTP [PR96097]
authorMarek Polacek <polacek@redhat.com>
Tue, 3 Sep 2024 21:01:48 +0000 (17:01 -0400)
committerMarek Polacek <polacek@redhat.com>
Thu, 12 Sep 2024 13:14:48 +0000 (09:14 -0400)
commit25ac2bb57ae400621050a7e0845994336ca83b99
tree5f8163c3ff9b8fa140d1738dbd9212eaab599b5d
parent9ebc9fbdddfe1ec85355b068354315a4da8e1ca0
c++: ICE with TTP [PR96097]

We crash when dependent_type_p gets a TEMPLATE_TYPE_PARM outside
a template.  That happens here because in

  template <template <typename T, typename T::type TT> typename X>
  void func() {}
  template <typename U, int I>
  struct Y {};
  void g() { func<Y>(); }

when performing overload resolution for func<Y>() we have to check
if U matches T and I matches TT.  So we wind up in
coerce_template_template_parm/PARM_DECL.  TREE_TYPE (arg) is int
so we try to substitute TT's type, which is T::type.  But we have
nothing to substitute T with.  And we call make_typename_type where
ctx is still T, which checks dependent_scope_p and we trip the assert.

It should work to always perform the substitution in a template context.
If the result still contains template parameters, we cannot say if they
match.

PR c++/96097

gcc/cp/ChangeLog:

* pt.cc (coerce_template_template_parm): Increment
processing_template_decl before calling tsubst.

gcc/testsuite/ChangeLog:

* g++.dg/template/ttp44.C: New test.
gcc/cp/pt.cc
gcc/testsuite/g++.dg/template/ttp44.C [new file with mode: 0644]