Commit 10ab8f62 by Fabien Chêne Committed by Jason Merrill

re PR c++/43890 (invalid uninitialized reference in class)

	PR c++/43890
	* init.c (diagnose_uninitialized_cst_or_ref_member): check for
	user-provided constructor while recursing.

From-SVN: r158918
parent 1b5e827b
2010-04-29 Fabien Chêne <fabien.chene@gmail.com>
PR c++/43890
* init.c (diagnose_uninitialized_cst_or_ref_member): check for
user-provided constructor while recursing.
2010-04-28 Manuel López-Ibáñez <manu@gcc.gnu.org> 2010-04-28 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c++/9335 PR c++/9335
......
...@@ -1779,6 +1779,9 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ...@@ -1779,6 +1779,9 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
{ {
tree field; tree field;
if (type_has_user_provided_constructor (type))
return;
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
{ {
tree field_type; tree field_type;
...@@ -1791,8 +1794,8 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ...@@ -1791,8 +1794,8 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
if (TREE_CODE (field_type) == REFERENCE_TYPE) if (TREE_CODE (field_type) == REFERENCE_TYPE)
{ {
if (using_new) if (using_new)
error ("uninitialized reference member in %q#T using %<new%>", error ("uninitialized reference member in %q#T "
origin); "using %<new%> without new-initializer", origin);
else else
error ("uninitialized reference member in %q#T", origin); error ("uninitialized reference member in %q#T", origin);
inform (DECL_SOURCE_LOCATION (field), inform (DECL_SOURCE_LOCATION (field),
...@@ -1802,8 +1805,8 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ...@@ -1802,8 +1805,8 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
if (CP_TYPE_CONST_P (field_type)) if (CP_TYPE_CONST_P (field_type))
{ {
if (using_new) if (using_new)
error ("uninitialized const member in %q#T using %<new%>", error ("uninitialized const member in %q#T "
origin); "using %<new%> without new-initializer", origin);
else else
error ("uninitialized const member in %q#T", origin); error ("uninitialized const member in %q#T", origin);
inform (DECL_SOURCE_LOCATION (field), inform (DECL_SOURCE_LOCATION (field),
...@@ -1908,13 +1911,13 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, ...@@ -1908,13 +1911,13 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
is_initialized = (TYPE_NEEDS_CONSTRUCTING (elt_type) || *init != NULL); is_initialized = (TYPE_NEEDS_CONSTRUCTING (elt_type) || *init != NULL);
if (*init == NULL && !type_has_user_provided_constructor (elt_type)) if (*init == NULL)
{ {
bool uninitialized_error = false; bool maybe_uninitialized_error = false;
/* A program that calls for default-initialization [...] of an /* A program that calls for default-initialization [...] of an
entity of reference type is ill-formed. */ entity of reference type is ill-formed. */
if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type)) if (CLASSTYPE_REF_FIELDS_NEED_INIT (elt_type))
uninitialized_error = true; maybe_uninitialized_error = true;
/* A new-expression that creates an object of type T initializes /* A new-expression that creates an object of type T initializes
that object as follows: that object as follows:
...@@ -1929,9 +1932,9 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts, ...@@ -1929,9 +1932,9 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
const-qualified type, the program is ill-formed; */ const-qualified type, the program is ill-formed; */
if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type)) if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (elt_type))
uninitialized_error = true; maybe_uninitialized_error = true;
if (uninitialized_error) if (maybe_uninitialized_error)
{ {
if (complain & tf_error) if (complain & tf_error)
diagnose_uninitialized_cst_or_ref_member (elt_type, diagnose_uninitialized_cst_or_ref_member (elt_type,
......
2010-04-29 Fabien Chêne <fabien.chene@gmail.com>
PR c++/43890
* init.c (diagnose_uninitialized_cst_or_ref_member): check for
user-provided constructor while recursing.
2010-04-29 Janus Weil <janus@gcc.gnu.org> 2010-04-29 Janus Weil <janus@gcc.gnu.org>
PR fortran/42274 PR fortran/42274
......
// PR c++/43890
// { dg-do compile }
class Outer
{
public:
Outer()
: i(*this)
{
}
class Inner
{
public:
Inner(Outer& o)
: o(o)
, i(0)
{
}
private:
Outer& o;
int const i;
};
private:
Inner i;
};
class A {
Outer o;
};
int main()
{
A *a = new A;
return 0;
}
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