[Bug c++/96410] A lambda with a template parameter list inside the template function using C++20 requires clauses is not usable in a constant expression

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Sep 17 13:30:41 GMT 2020


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

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

https://gcc.gnu.org/g:b28b621ac67beee81a47adb50b954bcf751570fd

commit r11-3261-gb28b621ac67beee81a47adb50b954bcf751570fd
Author: Patrick Palka <ppalka@redhat.com>
Date:   Thu Sep 17 09:16:02 2020 -0400

    c++: requires-expressions and partial instantiation [PR96410]

    This patch makes tsubst_requires_expr avoid substituting into a
    requires-expression when partially instantiating a generic lambda.
    This is necessary in general to ensure that we always check requirements
    in lexical order (as in the first testcase below).  A mechanism similar
    to PACK_EXPANSION_EXTRA_ARGS is added to remember template arguments and
    defer substitution of requires-expressions.

    Incidentally, this change also fixes the two mentioned PRs -- the
    problem there is that tsubst_requires_expr was performing semantic
    checks on template trees, and some of the checks are not prepared to
    handle such trees.  With this patch, tsubst_requires_expr no longer
    does any semantic checking at all when processing_template_decl.

    gcc/cp/ChangeLog:

            PR c++/96409
            PR c++/96410
            * constraint.cc (tsubst_requires_expr): Use REQUIRES_EXPR_PARMS
            and REQUIRES_EXPR_REQS.  Use REQUIRES_EXPR_EXTRA_ARGS,
            add_extra_args and build_extra_args to defer substitution until
            we have all the template arguments.
            (finish_requires_expr): Adjust the call to build_min so that
            REQUIRES_EXPR_EXTRA_ARGS gets set to NULL_TREE.
            * cp-tree.def (REQUIRES_EXPR): Give it a third operand.
            * cp-tree.h (REQUIRES_EXPR_PARMS, REQUIRES_EXPR_REQS,
            REQUIRES_EXPR_EXTRA_ARGS): Define.
            (add_extra_args, build_extra_args): Declare.

    gcc/testsuite/ChangeLog:

            PR c++/96409
            PR c++/96410
            * g++.dg/cpp2a/concepts-lambda13.C: New test.
            * g++.dg/cpp2a/concepts-lambda14.C: New test.


More information about the Gcc-bugs mailing list