https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96097

--- Comment #9 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:25ac2bb57ae400621050a7e0845994336ca83b99

commit r15-3603-g25ac2bb57ae400621050a7e0845994336ca83b99
Author: Marek Polacek <pola...@redhat.com>
Date:   Tue Sep 3 17:01:48 2024 -0400

    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.

Reply via email to