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:
parent
6cb4308702
commit
0e02d8e375
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
...
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'" }
|
Loading…
Reference in New Issue