re PR c++/58126 (No diagnostic when inheriting an uninitialized const or reference member)

/cp
2013-10-06  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58126
	* class.c (check_bases): Propagate CLASSTYPE_READONLY_FIELDS_NEED_INIT
	and CLASSTYPE_REF_FIELDS_NEED_INIT from bases to derived.
	* init.c (diagnose_uninitialized_cst_or_ref_member_1): Extend error
	messages about uninitialized const and references members to mention
	the base class.

/testsuite
2013-10-06  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/58126
	* g++.dg/init/uninitialized1.C: New.

From-SVN: r203232
This commit is contained in:
Paolo Carlini 2013-10-06 21:41:19 +00:00 committed by Paolo Carlini
parent 6cb4308702
commit 0e02d8e375
5 changed files with 66 additions and 8 deletions

View File

@ -1,3 +1,12 @@
2013-10-06 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58126
* class.c (check_bases): Propagate CLASSTYPE_READONLY_FIELDS_NEED_INIT
and CLASSTYPE_REF_FIELDS_NEED_INIT from bases to derived.
* init.c (diagnose_uninitialized_cst_or_ref_member_1): Extend error
messages about uninitialized const and references members to mention
the base class.
2013-10-06 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56060

View File

@ -1517,6 +1517,12 @@ check_bases (tree t,
|= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype);
TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)
|| TYPE_HAS_COMPLEX_DFLT (basetype));
SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT
(t, CLASSTYPE_READONLY_FIELDS_NEED_INIT (t)
| CLASSTYPE_READONLY_FIELDS_NEED_INIT (basetype));
SET_CLASSTYPE_REF_FIELDS_NEED_INIT
(t, CLASSTYPE_REF_FIELDS_NEED_INIT (t)
| CLASSTYPE_REF_FIELDS_NEED_INIT (basetype));
/* A standard-layout class is a class that:
...

View File

@ -2120,11 +2120,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
++ error_count;
if (complain)
{
if (using_new)
error ("uninitialized reference member in %q#T "
"using %<new%> without new-initializer", origin);
if (DECL_CONTEXT (field) == origin)
{
if (using_new)
error ("uninitialized reference member in %q#T "
"using %<new%> without new-initializer", origin);
else
error ("uninitialized reference member in %q#T", origin);
}
else
error ("uninitialized reference member in %q#T", origin);
{
if (using_new)
error ("uninitialized reference member in base %q#T "
"of %q#T using %<new%> without new-initializer",
DECL_CONTEXT (field), origin);
else
error ("uninitialized reference member in base %q#T "
"of %q#T", DECL_CONTEXT (field), origin);
}
inform (DECL_SOURCE_LOCATION (field),
"%qD should be initialized", field);
}
@ -2135,11 +2148,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
++ error_count;
if (complain)
{
if (using_new)
error ("uninitialized const member in %q#T "
"using %<new%> without new-initializer", origin);
if (DECL_CONTEXT (field) == origin)
{
if (using_new)
error ("uninitialized const member in %q#T "
"using %<new%> without new-initializer", origin);
else
error ("uninitialized const member in %q#T", origin);
}
else
error ("uninitialized const member in %q#T", origin);
{
if (using_new)
error ("uninitialized const member in base %q#T "
"of %q#T using %<new%> without new-initializer",
DECL_CONTEXT (field), origin);
else
error ("uninitialized const member in base %q#T "
"of %q#T", DECL_CONTEXT (field), origin);
}
inform (DECL_SOURCE_LOCATION (field),
"%qD should be initialized", field);
}

View File

@ -1,3 +1,8 @@
2013-10-06 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58126
* g++.dg/init/uninitialized1.C: New.
2013-10-06 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56060

View File

@ -0,0 +1,12 @@
// PR c++/58126
struct A {
const int value1;
int& value2;
};
struct B : A { };
A a; // { dg-error "uninitialized const member in 'struct A'|uninitialized reference member in 'struct A'" }
B b; // { dg-error "uninitialized const member in base 'struct A' of 'struct B'|uninitialized reference member in base 'struct A' of 'struct B'" }