This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Reject lambda closure types in decompositions (PR c++/78896)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 25 Jan 2017 22:07:44 +0100
- Subject: [C++ PATCH] Reject lambda closure types in decompositions (PR c++/78896)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
As discussed in the PR, while lambda closure types are class types, it
is implementation dependent on what those class types actually contain,
allowing that to be decomposed is just weird.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2017-01-25 Jakub Jelinek <jakub@redhat.com>
PR c++/78896
* decl.c (cp_finish_decomp): Disallow memberwise decomposition of
lambda expressions.
* g++.dg/cpp1z/decomp24.C: New test.
--- gcc/cp/decl.c.jj 2017-01-25 17:17:51.000000000 +0100
+++ gcc/cp/decl.c 2017-01-25 19:16:19.439879509 +0100
@@ -7562,6 +7562,11 @@ cp_finish_decomp (tree decl, tree first,
error_at (loc, "cannot decompose non-array non-class type %qT", type);
goto error_out;
}
+ else if (LAMBDA_TYPE_P (type))
+ {
+ error_at (loc, "cannot decompose lambda closure type %qT", type);
+ goto error_out;
+ }
else
{
tree btype = find_decomp_class_base (loc, type, NULL_TREE);
--- gcc/testsuite/g++.dg/cpp1z/decomp24.C.jj 2017-01-25 19:19:42.536296515 +0100
+++ gcc/testsuite/g++.dg/cpp1z/decomp24.C 2017-01-25 19:19:20.000000000 +0100
@@ -0,0 +1,11 @@
+// PR c++/78896
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+int
+foo ()
+{
+ int a {10};
+ auto [b] { [&a](){} }; // { dg-error "cannot decompose lambda closure type" }
+ return b - a; // { dg-warning "decomposition declaration only available with" "" { target c++14_down } .-1 }
+}
Jakub