Commit 0e02d8e3 by Paolo Carlini Committed by Paolo Carlini

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
parent 6cb43087
2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> 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 PR c++/56060
* pt.c (type_dependent_expression_p): Handle EXPR_PACK_EXPANSION. * pt.c (type_dependent_expression_p): Handle EXPR_PACK_EXPANSION.
......
...@@ -1517,6 +1517,12 @@ check_bases (tree t, ...@@ -1517,6 +1517,12 @@ check_bases (tree t,
|= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype); |= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype);
TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype) TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)
|| TYPE_HAS_COMPLEX_DFLT (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: /* A standard-layout class is a class that:
... ...
......
...@@ -2120,11 +2120,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ...@@ -2120,11 +2120,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
++ error_count; ++ error_count;
if (complain) if (complain)
{ {
if (using_new) if (DECL_CONTEXT (field) == origin)
error ("uninitialized reference member in %q#T " {
"using %<new%> without new-initializer", 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 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), inform (DECL_SOURCE_LOCATION (field),
"%qD should be initialized", field); "%qD should be initialized", field);
} }
...@@ -2135,11 +2148,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ...@@ -2135,11 +2148,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
++ error_count; ++ error_count;
if (complain) if (complain)
{ {
if (using_new) if (DECL_CONTEXT (field) == origin)
error ("uninitialized const member in %q#T " {
"using %<new%> without new-initializer", 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 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), inform (DECL_SOURCE_LOCATION (field),
"%qD should be initialized", field); "%qD should be initialized", field);
} }
......
2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> 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 PR c++/56060
* g++.dg/cpp0x/variadic144.C: New. * g++.dg/cpp0x/variadic144.C: New.
......
// 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'" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment