[C++ Patch] PR 53096

Paolo Carlini paolo.carlini@oracle.com
Wed Apr 25 14:25:00 GMT 2012


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.

/////////////////////
-------------- next part --------------
/cp
2012-04-25  Paolo Carlini  <paolo.carlini@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.carlini@oracle.com>

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

-------------- next part --------------
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 (tiemann@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);
       }


More information about the Gcc-patches mailing list