c++: requires-expressions and partial instantiation [PR96410]
authorPatrick Palka <ppalka@redhat.com>
Thu, 17 Sep 2020 13:16:02 +0000 (09:16 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 17 Sep 2020 13:16:02 +0000 (09:16 -0400)
commitb28b621ac67beee81a47adb50b954bcf751570fd
tree8fa20ad6c88d0c2bf9f95239a059df843e92bad2
parent9fcedcc39153cb3cfa08ebab20aef6cdfb9ed609
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.
gcc/cp/constraint.cc
gcc/cp/cp-tree.def
gcc/cp/cp-tree.h
gcc/testsuite/g++.dg/cpp2a/concepts-lambda13.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/concepts-lambda14.C [new file with mode: 0644]