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

--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Jason Merrill <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:1949beb7dbe66687542f4a19d316914dd73fe84d

commit r15-9066-g1949beb7dbe66687542f4a19d316914dd73fe84d
Author: Jason Merrill <ja...@redhat.com>
Date:   Sat Mar 29 14:00:55 2025 -0400

    c++: lambda in function template signature [PR119401]

    Here we instantiate the lambda three times in producing A<0>::f:
    1) in tsubst_function_type, substituting the type of A<>::f
    2) in tsubst_function_decl, substituting the parameters of A<>::f
    3) in regenerate_decl_from_template when instantiating A<>::f

    The first one gets thrown away by maybe_rebuild_function_decl_type.  Before
    r15-7202, we happily built all of them and mangled the result wrongly as
    lambda #3.  After r15-7202, we try to mangle #3 as #1, which breaks because
     #1 is already mangled as #1.

    This patch avoids building #3 by suppressing regenerate_decl_from_template
    if the template signature includes a lambda, fixing the ICE.

    We now mangle the lambda as #2, which is still wrong.  Addressing that
    should involve not calling tsubst_function_type from tsubst_function_decl,
    and building the type from the parms types in the first place rather than
    fixing it up in maybe_rebuild_function_decl_type.

            PR c++/119401

    gcc/cp/ChangeLog:

            * pt.cc (regenerate_decl_from_template): Don't regenerate if the
            signature involves a lambda.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp2a/lambda-targ11.C: New test.

Reply via email to