aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-06-14 21:05:13 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-06-14 21:05:13 +0200
commitbc04d1ff62db94aea033829249c8b09f4b7abff1 (patch)
tree4b7a6b953f09d9e68ba6520ded1c9d913441db6c /gcc/cp
parent2d26d4ce69d8510e32a5a4b9653de9dee0109f04 (diff)
downloadgcc-bc04d1ff62db94aea033829249c8b09f4b7abff1.zip
gcc-bc04d1ff62db94aea033829249c8b09f4b7abff1.tar.gz
gcc-bc04d1ff62db94aea033829249c8b09f4b7abff1.tar.bz2
P0624R2 - Default constructible and assignable stateless lambdas
P0624R2 - Default constructible and assignable stateless lambdas * method.c (synthesized_method_walk): For C++2a don't mark sfk_constructor or sfk_copy_assignment as deleted if lambda has no lambda-captures. * g++.dg/cpp2a/lambda1.C: New test. * g++.dg/cpp0x/lambda/lambda-ice2.C: Adjust expected diagnostics for -std=c++2a. From-SVN: r261605
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/method.c11
2 files changed, 15 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d1fdc42..dd9b7db 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2018-06-14 Jakub Jelinek <jakub@redhat.com>
+
+ P0624R2 - Default constructible and assignable stateless lambdas
+ * method.c (synthesized_method_walk): For C++2a don't mark
+ sfk_constructor or sfk_copy_assignment as deleted if lambda has
+ no lambda-captures.
+
2018-06-14 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (duplicate_decls): Use DECL_SOURCE_LOCATION in
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 8e7590c..858655b 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1539,10 +1539,15 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p,
{
/* "The closure type associated with a lambda-expression has a deleted
default constructor and a deleted copy assignment operator."
- This is diagnosed in maybe_explain_implicit_delete. */
+ This is diagnosed in maybe_explain_implicit_delete.
+ In C++2a, only lambda-expressions with lambda-captures have those
+ deleted. */
if (LAMBDA_TYPE_P (ctype)
- && (sfk == sfk_constructor
- || sfk == sfk_copy_assignment))
+ && (sfk == sfk_constructor || sfk == sfk_copy_assignment)
+ && (cxx_dialect < cxx2a
+ || LAMBDA_EXPR_CAPTURE_LIST (CLASSTYPE_LAMBDA_EXPR (ctype))
+ || LAMBDA_EXPR_DEFAULT_CAPTURE_MODE
+ (CLASSTYPE_LAMBDA_EXPR (ctype)) != CPLD_NONE))
{
*deleted_p = true;
return;