diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-06-14 21:05:13 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-06-14 21:05:13 +0200 |
commit | bc04d1ff62db94aea033829249c8b09f4b7abff1 (patch) | |
tree | 4b7a6b953f09d9e68ba6520ded1c9d913441db6c /gcc/cp | |
parent | 2d26d4ce69d8510e32a5a4b9653de9dee0109f04 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/method.c | 11 |
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; |