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

--- Comment #7 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:7bfb1550ccea7c426d50244e980f01f30db8ba0c

commit r14-559-g7bfb1550ccea7c426d50244e980f01f30db8ba0c
Author: Patrick Palka <ppa...@redhat.com>
Date:   Sun May 7 11:54:21 2023 -0400

    c++: bound ttp in lambda function type [PR109651]

    After r14-11-g2245459c85a3f4 we now coerce the template arguments of a
    bound ttp again after level-lowering it.  Notably a level-lowered ttp
    doesn't have DECL_CONTEXT set, so during this coercion we fall back to
    using current_template_parms to obtain the relevant set of in-scope
    parameters.

    But it turns out current_template_parms isn't properly set when
    substituting the function type of a generic lambda, and so if the type
    contains bound ttps that need to be lowered we'll crash during their
    attempted coercion.  Specifically in the first testcase below,
    current_template_parms during the lambda type substitution (with T=int)
    is "1 U" instead of the expected "2 TT, 1 U", and we crash when level
    lowering TT<int>.

    Ultimately the problem is that tsubst_lambda_expr does things in the
    wrong order: we ought to substitute (and install) the in-scope template
    parameters _before_ substituting anything that may use those template
    parameters (such as the function type of a generic lambda).  This patch
    corrects this substitution order.

            PR c++/109651

    gcc/cp/ChangeLog:

            * pt.cc (coerce_template_args_for_ttp): Mention we can hit the
            current_template_parms fallback when level-lowering a bound ttp.
            (tsubst_template_decl): Add lambda_tparms parameter.  Prefer to
            use lambda_tparms instead of substituting DECL_TEMPLATE_PARMS.
            (tsubst_decl) <case TEMPLATE_DECL>: Pass NULL_TREE as lambda_tparms
            to tsubst_template_decl.
            (tsubst_lambda_expr): For a generic lambda, substitute
            DECL_TEMPLATE_PARMS and set current_template_parms to it
            before substituting the function type.  Pass the substituted
            DECL_TEMPLATE_PARMS as lambda_tparms to tsubst_template_decl.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp2a/lambda-generic-ttp1.C: New test.
            * g++.dg/cpp2a/lambda-generic-ttp2.C: New test.

Reply via email to