diff options
author | Jason Merrill <jason@gcc.gnu.org> | 2008-12-04 14:00:03 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2008-12-04 14:00:03 -0500 |
commit | f782c65c3da796b4eb907daa55a160f1203ee5e6 (patch) | |
tree | 175fb67e45c27c46f67a8bee4a79a8b083beec40 | |
parent | 1d9aba81050b524d9dd61e59f4b28382782051b3 (diff) | |
download | gcc-f782c65c3da796b4eb907daa55a160f1203ee5e6.zip gcc-f782c65c3da796b4eb907daa55a160f1203ee5e6.tar.gz gcc-f782c65c3da796b4eb907daa55a160f1203ee5e6.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/class.c | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/defaulted6.C | 13 |
5 files changed, 33 insertions, 4 deletions
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 <jason@redhat.com> + + 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 <rguenther@suse.de> PR c++/38334 @@ -179,7 +187,7 @@ 2008-11-05 Fabien Chene <fabien.chene@gmail.com> - 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 <jason@redhat.com> + + PR c++/37906 + * g++.dg/cpp0x/defaulted6.C: New test. + 2008-12-04 Richard Guenther <rguenther@suse.de> 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"); +} |