diff options
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/init.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist-value2.C | 20 |
4 files changed, 35 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0352c2c..2f7b215 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-06-29 Jason Merrill <jason@redhat.com> + * init.c (build_value_init): Decide whether or not to zero-initialize + based on user-providedness of default ctor, not any ctor. + (build_value_init_noctor): Adjust assert. + DR 990 * call.c (convert_like_real) [ck_user]: Handle value-initialization. (build_new_method_call_1): Likewise. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 1719339..ac2b733 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -334,14 +334,20 @@ build_value_init (tree type, tsubst_flags_t complain) if (CLASS_TYPE_P (type)) { - if (type_has_user_provided_constructor (type)) + /* Instead of the above, only consider the user-providedness of the + default constructor itself so value-initializing a class with an + explicitly defaulted default constructor and another user-provided + constructor works properly (c++std-core-19883). */ + if (type_has_user_provided_default_constructor (type) + || (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type) + && type_has_user_provided_constructor (type))) return build_aggr_init_expr (type, build_special_member_call (NULL_TREE, complete_ctor_identifier, NULL, type, LOOKUP_NORMAL, complain), complain); - else if (type_build_ctor_call (type)) + else if (TYPE_HAS_COMPLEX_DFLT (type)) { /* This is a class that needs constructing, but doesn't have a user-provided constructor. So we need to zero-initialize @@ -371,7 +377,7 @@ build_value_init_noctor (tree type, tsubst_flags_t complain) SFINAE-enabled. */ if (CLASS_TYPE_P (type)) { - gcc_assert (!type_build_ctor_call (type)); + gcc_assert (!TYPE_HAS_COMPLEX_DFLT (type)); if (TREE_CODE (type) != UNION_TYPE) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ea6120..0794930 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-06-29 Jason Merrill <jason@redhat.com> + * g++.dg/cpp0x/initlist-value2.C: New. + * g++.dg/cpp0x/constexpr-initlist4.C: New. * g++.dg/cpp0x/initlist-value.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C new file mode 100644 index 0000000..2b78241 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-value2.C @@ -0,0 +1,20 @@ +// Test that we properly value-initialize a class with a user-provided +// constructor but defaulted default constructor. The FDIS got this +// wrong; see c++std-core-19883. + +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + int i; + A() = default; + A(int); +}; + +int main() +{ + A a{}; + if (a.i != 0) + return 1; +} |