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

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>:

https://gcc.gnu.org/g:01aff2ba18a654324957af446a3065db489c0f14

commit r13-1224-g01aff2ba18a654324957af446a3065db489c0f14
Author: Patrick Palka <ppa...@redhat.com>
Date:   Thu Jun 23 16:18:55 2022 -0400

    c++: context completion in lookup_template_class [PR105982]

    The below testcase demonstrates that completion of the substituted
    context during lookup_template_class can end up registering the desired
    specialization for us in more cases than r13-1045-gcb7fd1ea85feea
    anticipated.  In particular this can happen for a non-dependent
    specialization of a nested class as well.

    For this testcase, during overload resolution with A's guides, we
    substitute the deduced argument T=int into the TYPENAME_TYPE B::C,
    during which we call lookup_template_class for A<T>::B with T=int,
    which completes A<int> for the first time, which recursively registers
    the desired specialization of B already.  The parent call to
    lookup_template_class then tries to register the same specialization,
    triggering an ICE.

    This patch fixes this by making lookup_template_class determine more
    directly whether we need to recheck the specializations table after
    completion of the context -- when and only when the call to complete_type
    had an effect.

            PR c++/105982

    gcc/cp/ChangeLog:

            * pt.cc (lookup_template_class): After calling complete_type for
            the substituted context, check the table again iff the type was
            previously incomplete and complete_type made it complete.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1z/class-deduction111.C: New test.

Reply via email to