re PR c++/29043 (Constructor for POD type with const member without member initializer accepted)

PR c++/29043
	* init.c (perform_member_init): check for uninitialized const or
	reference members, including array types.

From-SVN: r158817
This commit is contained in:
Fabien Chêne 2010-04-28 00:03:21 +00:00 committed by Jason Merrill
parent 928fe27c82
commit 31d1aceca6
4 changed files with 69 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2010-04-27 Fabien Chêne <fabien.chene@gmail.com>
PR c++/29043
* init.c (perform_member_init): check for uninitialized const or
reference members, including array types.
2010-04-24 Jason Merrill <jason@redhat.com>
* tree.c (get_fns): Split out from get_first_fn.

View File

@ -506,6 +506,7 @@ perform_member_init (tree member, tree init)
{
if (init == NULL_TREE)
{
tree core_type;
/* member traversal: note it leaves init NULL */
if (TREE_CODE (type) == REFERENCE_TYPE)
permerror (DECL_SOURCE_LOCATION (current_function_decl),
@ -515,6 +516,11 @@ perform_member_init (tree member, tree init)
permerror (DECL_SOURCE_LOCATION (current_function_decl),
"uninitialized member %qD with %<const%> type %qT",
member, type);
core_type = strip_array_types (type);
if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
|| CLASSTYPE_REF_FIELDS_NEED_INIT (core_type))
diagnose_uninitialized_cst_or_ref_member (core_type, /*using_new=*/false);
}
else if (TREE_CODE (init) == TREE_LIST)
/* There was an explicit member initialization. Do some work

View File

@ -1,3 +1,8 @@
2010-04-27 Fabien Chêne <fabien.chene@gmail.com>
PR c++/29043
* g++.dg/init/pr29043.C: New.
2010-04-27 Jason Merrill <jason@redhat.com>
* g++.dg/lookup/scoped5.C: Adjust.

View File

@ -0,0 +1,52 @@
// PR c++/29043
// { dg-do compile }
struct S
{
int const i; // { dg-message "should be initialized" }
};
class C
{
public:
C() {} // { dg-error "uninitialized const member" }
S s;
};
struct S2
{
int& ref; // { dg-message "should be initialized" }
};
class C2
{
public:
C2() {} // { dg-error "uninitialized reference member" }
S2 s;
};
class C3
{
C3() { }
struct s {
const int i;
};
};
struct S4
{
int const i; // { dg-message "should be initialized" }
};
struct C4
{
C4() {} // { dg-error "uninitialized const member" }
S4 s4[ 1 ];
};
struct C5
{
C5() {} // { dg-message "uninitialized" }
int const iit[ 1 ];
};