Hi,

this PR is about the resolution of core/1333 being unimplemented, thus we reject things like:

    struct foo
    {
      foo(foo&) = default; // ERROR HERE
    };

(and this can be annoying, as explained by Eric on the reflector, for example when one has to resort to out-of-class defaulting which means non-trivial)

Thus, the below elementary patch appears to work fine (I also double checked that in such cases the type remains trivial). It's all there is to it?

Thanks,
Paolo.

/////////////////////
/cp
2012-04-25  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/53096
        * class.c (check_bases_and_members): Implement core/1333, do not
        disallow defaulted in the class body special members.

/testsuite
2012-04-25  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/53096
        * g++.dg/cpp0x/defaulted35.C: New.
        * g++.dg/cpp0x/defaulted15.C: Adjust.

Index: testsuite/g++.dg/cpp0x/defaulted15.C
===================================================================
--- testsuite/g++.dg/cpp0x/defaulted15.C        (revision 186816)
+++ testsuite/g++.dg/cpp0x/defaulted15.C        (working copy)
@@ -43,7 +43,7 @@ SA(__has_trivial_copy(E));
 
 struct F
 {
-  F(F&) = default;             // { dg-error "non-const" }
+  F(F&) = default;
 };
 
 struct G: public F
Index: testsuite/g++.dg/cpp0x/defaulted35.C
===================================================================
--- testsuite/g++.dg/cpp0x/defaulted35.C        (revision 0)
+++ testsuite/g++.dg/cpp0x/defaulted35.C        (revision 0)
@@ -0,0 +1,8 @@
+// PR c++/53096
+// { dg-options -std=c++0x }
+
+struct foo
+{
+  foo(foo&) = default;
+  foo& operator=(foo&) = default;
+};
Index: cp/class.c
===================================================================
--- cp/class.c  (revision 186816)
+++ cp/class.c  (working copy)
@@ -1,6 +1,7 @@
 /* Functions related to building classes and their related objects.
    Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011,
+   2012
    Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiem...@cygnus.com)
 
@@ -5144,9 +5145,6 @@ check_bases_and_members (tree t)
                 give the synthesis error.  */
              error ("%q+D declared to take const reference, but implicit "
                     "declaration would take non-const", fn);
-           else if (imp_const_p && !fn_const_p)
-             error ("%q+D declared to take non-const reference cannot be "
-                    "defaulted in the class body", fn);
          }
        defaulted_late_check (fn);
       }

Reply via email to