From: Jason Merrill Date: Wed, 29 Jun 2011 14:09:03 +0000 (-0400) Subject: init.c (build_value_init): Decide whether or not to zero-initialize based on user... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7b37a0c548b633d91e07fbb2c941828aafd5cd3b;p=gcc.git init.c (build_value_init): Decide whether or not to zero-initialize based on user-providedness of default... * 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. From-SVN: r175640 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0352c2ccf44..2f7b215d97b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-06-29 Jason Merrill + * 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 17193393398..ac2b733d9bf 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 7ea6120583f..0794930afce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-06-29 Jason Merrill + * 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 00000000000..2b78241e956 --- /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; +}