From: Jason Merrill Date: Fri, 14 Oct 2011 19:12:45 +0000 (-0400) Subject: re PR c++/50707 ([C++0x] Non-static const data member initializer breaks default... X-Git-Tag: releases/gcc-4.7.0~3095 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=37d8632b512e4b4b04aea3f951f52af8bd440bfe;p=thirdparty%2Fgcc.git re PR c++/50707 ([C++0x] Non-static const data member initializer breaks default constructor) PR c++/50507 * method.c (walk_field_subobs): Check for NSDMI before complaining about uninitialized fields. From-SVN: r180002 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0edf96641f67..b55e2947bc43 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-10-14 Jason Merrill + PR c++/50507 + * method.c (walk_field_subobs): Check for NSDMI before + complaining about uninitialized fields. + * pt.c (tsubst_decl) [FIELD_DECL]: Use void_zero_node instead of error_mark_node as a placeholder. diff --git a/gcc/cp/method.c b/gcc/cp/method.c index f4a3ea6ac99d..0718f47d743e 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1016,25 +1016,7 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk, } else if (sfk == sfk_constructor) { - bool bad = true; - if (CP_TYPE_CONST_P (mem_type) - && default_init_uninitialized_part (mem_type)) - { - if (msg) - error ("uninitialized non-static const member %q#D", - field); - } - else if (TREE_CODE (mem_type) == REFERENCE_TYPE) - { - if (msg) - error ("uninitialized non-static reference member %q#D", - field); - } - else - bad = false; - - if (bad && deleted_p) - *deleted_p = true; + bool bad; if (DECL_INITIAL (field)) { @@ -1057,6 +1039,26 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk, continue; } + bad = false; + if (CP_TYPE_CONST_P (mem_type) + && default_init_uninitialized_part (mem_type)) + { + if (msg) + error ("uninitialized non-static const member %q#D", + field); + bad = true; + } + else if (TREE_CODE (mem_type) == REFERENCE_TYPE) + { + if (msg) + error ("uninitialized non-static reference member %q#D", + field); + bad = true; + } + + if (bad && deleted_p) + *deleted_p = true; + /* For an implicitly-defined default constructor to be constexpr, every member must have a user-provided default constructor or an explicit initializer. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 708f3fd78dc5..80ef91c87f97 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-10-14 Jason Merrill + + PR c++/50507 + * g++.dg/cpp0x/nsdmi-const1.C: New. + 2011-10-14 Janus Weil PR fortran/50570 diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C new file mode 100644 index 000000000000..ddf9f04c580a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-const1.C @@ -0,0 +1,10 @@ +// PR c++/50707 +// { dg-options -std=c++0x } + +int g; + +struct S { + int const v=g; +}; + +S s;