aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-09-17 09:16:02 -0400
committerPatrick Palka <ppalka@redhat.com>2020-09-17 09:16:02 -0400
commitb28b621ac67beee81a47adb50b954bcf751570fd (patch)
tree8fa20ad6c88d0c2bf9f95239a059df843e92bad2 /libcpp
parent9fcedcc39153cb3cfa08ebab20aef6cdfb9ed609 (diff)
downloadgcc-b28b621ac67beee81a47adb50b954bcf751570fd.zip
gcc-b28b621ac67beee81a47adb50b954bcf751570fd.tar.gz
gcc-b28b621ac67beee81a47adb50b954bcf751570fd.tar.bz2
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.
Diffstat (limited to 'libcpp')
0 files changed, 0 insertions, 0 deletions