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);
}