From: Jason Merrill Date: Thu, 4 Dec 2008 19:00:03 +0000 (-0500) Subject: re PR c++/37906 (has_trivial_default_constructor vs. deleted copy ctor) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f782c65c3da796b4eb907daa55a160f1203ee5e6;p=platform%2Fupstream%2Fgcc.git re PR c++/37906 (has_trivial_default_constructor vs. deleted copy ctor) PR c++/37906 * decl.c (grok_special_member_properties): Set TYPE_HAS_COMPLEX_DFLT here. * class.c (check_bases_and_members): Rather than assuming any user-declared default constructor is complex here. From-SVN: r142442 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 029d2ad..9c74714 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2008-12-04 Jason Merrill + + PR c++/37906 + * decl.c (grok_special_member_properties): Set TYPE_HAS_COMPLEX_DFLT + here. + * class.c (check_bases_and_members): Rather than assuming any + user-declared default constructor is complex here. + 2008-12-04 Richard Guenther PR c++/38334 @@ -179,7 +187,7 @@ 2008-11-05 Fabien Chene - PR c++/35219 + PR c++/32519 * cp-tree.h: Fix DECL_NONSTATIC_MEMBER_P to handle member template functions. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 31123aa..8553139 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4301,8 +4301,7 @@ check_bases_and_members (tree t) |= (CLASSTYPE_NON_AGGREGATE (t) || saved_nontrivial_dtor || saved_complex_asn_ref); TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_CONTAINS_VPTR_P (t); - TYPE_HAS_COMPLEX_DFLT (t) - |= (TYPE_HAS_DEFAULT_CONSTRUCTOR (t) || TYPE_CONTAINS_VPTR_P (t)); + TYPE_HAS_COMPLEX_DFLT (t) |= TYPE_CONTAINS_VPTR_P (t); /* If the class has no user-declared constructor, but does have non-static const or reference data members that can never be diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index f2e12b3..70ccd32 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9842,7 +9842,11 @@ grok_special_member_properties (tree decl) TYPE_HAS_CONST_INIT_REF (class_type) = 1; } else if (sufficient_parms_p (FUNCTION_FIRST_USER_PARMTYPE (decl))) - TYPE_HAS_DEFAULT_CONSTRUCTOR (class_type) = 1; + { + TYPE_HAS_DEFAULT_CONSTRUCTOR (class_type) = 1; + if (TREE_CODE (decl) == TEMPLATE_DECL || !DECL_DEFAULTED_FN (decl)) + TYPE_HAS_COMPLEX_DFLT (class_type) = 1; + } else if (is_list_ctor (decl)) TYPE_HAS_LIST_CTOR (class_type) = 1; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e58bdbb..9c9d674 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-12-04 Jason Merrill + + PR c++/37906 + * g++.dg/cpp0x/defaulted6.C: New test. + 2008-12-04 Richard Guenther PR middle-end/36509 diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted6.C b/gcc/testsuite/g++.dg/cpp0x/defaulted6.C new file mode 100644 index 0000000..c33d572 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted6.C @@ -0,0 +1,13 @@ +// PR c++/37906 +// { dg-options "-std=c++0x" } + +struct b +{ + b() = default; + b(const b&) = delete; +}; + +void test01() +{ + static_assert(__has_trivial_constructor(b), "default ctor not trivial"); +}