method.c (implicitly_declare_fn): Handle deleted lambda default ctor and copy assop...
authorJason Merrill <jason@redhat.com>
Fri, 10 Oct 2014 20:27:07 +0000 (16:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 10 Oct 2014 20:27:07 +0000 (16:27 -0400)
* method.c (implicitly_declare_fn): Handle deleted lambda default
ctor and copy assop here.
* class.c (check_bases_and_members): Not here.
(add_implicitly_declared_members): And don't set
CLASSTYPE_LAZY_MOVE_ASSIGN.

From-SVN: r216105

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/method.c
gcc/testsuite/g++.dg/ext/is_trivially_constructible4.C [new file with mode: 0644]

index 1414f2be2f9ebe845684518f1ad9eaa0b2abfda5..3e2ab6ece4278805a0c821a784d11e08202ac303 100644 (file)
@@ -1,5 +1,11 @@
 2014-10-10  Jason Merrill  <jason@redhat.com>
 
+       * method.c (implicitly_declare_fn): Handle deleted lambda default
+       ctor and copy assop here.
+       * class.c (check_bases_and_members): Not here.
+       (add_implicitly_declared_members): And don't set
+       CLASSTYPE_LAZY_MOVE_ASSIGN.
+
        * semantics.c (finish_id_expression): Check for error_mark_node.
 
 2014-10-09  Jason Merrill  <jason@redhat.com>
index 12ac30a84a84ac09bf75acd6612097e22b839025..b6611870a23dff0fb2ca5f36a64053f19df3935e 100644 (file)
@@ -3158,7 +3158,7 @@ add_implicitly_declared_members (tree t, tree* access_decls,
       TYPE_HAS_COPY_ASSIGN (t) = 1;
       TYPE_HAS_CONST_COPY_ASSIGN (t) = !cant_have_const_assignment;
       CLASSTYPE_LAZY_COPY_ASSIGN (t) = 1;
-      if (move_ok)
+      if (move_ok && !LAMBDA_TYPE_P (t))
        CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 1;
     }
 
@@ -5624,13 +5624,6 @@ check_bases_and_members (tree t)
 
   if (LAMBDA_TYPE_P (t))
     {
-      /* "The closure type associated with a lambda-expression has a deleted
-        default constructor and a deleted copy assignment operator."  */
-      TYPE_NEEDS_CONSTRUCTING (t) = 1;
-      TYPE_HAS_COMPLEX_DFLT (t) = 1;
-      TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1;
-      CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 0;
-
       /* "This class type is not an aggregate."  */
       CLASSTYPE_NON_AGGREGATE (t) = 1;
     }
index 882898658ddcbde84e6ad1afc6b39c7781845ce7..dce2d2b2caf754f9aea7342b278bb8b3eec4988d 100644 (file)
@@ -1911,6 +1911,12 @@ implicitly_declare_fn (special_function_kind kind, tree type,
   DECL_DEFAULTED_FN (fn) = 1;
   if (cxx_dialect >= cxx11)
     {
+      /* "The closure type associated with a lambda-expression has a deleted
+        default constructor and a deleted copy assignment operator."  */
+      if ((kind == sfk_constructor
+          || kind == sfk_copy_assignment)
+         && LAMBDA_TYPE_P (type))
+       deleted_p = true;
       DECL_DELETED_FN (fn) = deleted_p;
       DECL_DECLARED_CONSTEXPR_P (fn) = constexpr_p;
     }
diff --git a/gcc/testsuite/g++.dg/ext/is_trivially_constructible4.C b/gcc/testsuite/g++.dg/ext/is_trivially_constructible4.C
new file mode 100644 (file)
index 0000000..c6d1758
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+
+#define SA(X) static_assert((X),#X)
+
+void f()
+{
+  int x;
+  auto l = [=]{ return x; };
+  typedef decltype(l) C;
+  SA(__is_trivially_copyable(C));
+  SA(__is_trivially_constructible(C,C));
+}