re PR c++/43719 (uninitialized const member incorrectly accepted, using an array)

PR c++/43719
	* decl.c (check_initializer): strip array type before checking for
	uninitialized const or ref members.

From-SVN: r159242
This commit is contained in:
Fabien Chêne 2010-05-10 18:37:45 +00:00 committed by Jason Merrill
parent 1de12eab74
commit 34655c9e68
5 changed files with 216 additions and 7 deletions

View File

@ -1,3 +1,9 @@
2010-05-10 Fabien Chêne <fabien.chene@gmail.com>
PR c++/43719
* decl.c (check_initializer): strip array type before checking for
uninitialized const or ref members.
2010-05-07 Fabien Chêne <fabien.chene@gmail.com>
PR c++/43951

View File

@ -5207,6 +5207,7 @@ check_initializer (tree decl, tree init, int flags, tree *cleanup)
{
tree type = TREE_TYPE (decl);
tree init_code = NULL;
tree core_type;
/* Things that are going to be initialized need to have complete
type. */
@ -5318,14 +5319,12 @@ check_initializer (tree decl, tree init, int flags, tree *cleanup)
check_for_uninitialized_const_var (decl);
return build_aggr_init_full_exprs (decl, init, flags);
}
else if (MAYBE_CLASS_TYPE_P (type))
else if (MAYBE_CLASS_TYPE_P (core_type = strip_array_types (type)))
{
tree core_type = strip_array_types (type);
if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type))
error ("structure %qD with uninitialized const members", decl);
if (CLASSTYPE_REF_FIELDS_NEED_INIT (core_type))
error ("structure %qD with uninitialized reference members", decl);
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,
/*complain=*/true);
check_for_uninitialized_const_var (decl);
}

View File

@ -1,3 +1,9 @@
2010-05-10 Fabien Chêne <fabien.chene@gmail.com>
PR c++/43719
* g++.dg/init/pr43719.C: New.
* g++.dg/anon-struct4.C: Adjust.
2010-05-10 Jakub Jelinek <jakub@redhat.com>
PR debug/44028

View File

@ -2,3 +2,4 @@
struct { struct { int& i ; } bar ; } foo ; // { dg-error "uninitialized" "uninit" }
// { dg-warning "anonymous" "anon" { target *-*-* } 3 }
// { dg-message "should be initialized" "ref-uninit" { target *-*-* } 3 }

View File

@ -0,0 +1,197 @@
// PR c++/43719
// { dg-do compile }
struct A1
{
int const j; // { dg-message "should be initialized" }
};
struct A2
{
int const volatile i; // { dg-message "should be initialized" }
};
struct A3
{
int& ref; // { dg-message "should be initialized" }
};
struct A4
{
int const& ref; // { dg-message "should be initialized" }
};
struct A5
{
int& ref; // { dg-message "should be initialized" }
int const i; // { dg-message "should be initialized" }
};
template <class T> struct S1
{
T const i; // { dg-message "should be initialized" }
};
template <class T> struct S2
{
T const volatile i; // { dg-message "should be initialized" }
};
template <class T> struct S3
{
T& ref; // { dg-message "should be initialized" }
};
template <class T> struct S4
{
T const i; // { dg-message "should be initialized" }
T& ref; // { dg-message "should be initialized" }
};
struct X
{
X () : c (0), r (c) {}
int const c;
int const& r;
};
struct Y11
{
int const i; // { dg-message "should be initialized" }
};
struct Y1
{
Y11 a[1];
};
struct Y22
{
int& ref; // { dg-message "should be initialized" }
};
struct Y2
{
Y22 a[1];
};
struct Z1
{
int const i; // { dg-message "should be initialized" }
};
struct Z2
{
int& ref; // { dg-message "should be initialized" }
};
struct Z3
{
int const i; // { dg-message "should be initialized" }
};
struct Z4
{
int& ref; // { dg-message "should be initialized" }
};
struct Z5
{
int i;
};
struct Z
{
Z1 z1;
Z2 z2;
Z3 z3;
Z4 z4;
Z5 z5;
};
union U
{
int const i; // { dg-message "should be initialized" }
};
void f1 ()
{
A1 a1; // { dg-error "uninitialized const member" }
}
void f2 ()
{
A2 a2; // { dg-error "uninitialized const member" }
}
void f3 ()
{
A3 a3; // { dg-error "uninitialized reference member" }
}
void f4 ()
{
A4 a4; // { dg-error "uninitialized reference member" }
}
void f5 ()
{
A5 a5; // { dg-error "uninitialized reference member|uninitialized const member" }
}
void f6 ()
{
S1<int> s; // { dg-error "uninitialized const member" }
}
void f7 ()
{
S2<int> s; // { dg-error "uninitialized const member" }
}
void f8 ()
{
S3<int> s; // { dg-error "uninitialized reference member" }
}
void f9 ()
{
S4<int> s; // { dg-error "uninitialized reference member|uninitialized const member" }
}
void f10 ()
{
X x;
}
void f11 ()
{
A1 a[ 1 ]; // { dg-error "uninitialized const member" }
}
void f12 ()
{
A3 a[ 1 ]; // { dg-error "uninitialized reference member" }
}
void f13 ()
{
Y1 y1; // { dg-error "uninitialized const member" }
}
void f14 ()
{
Y2 y2; // { dg-error "uninitialized reference member" }
}
void f15 ()
{
Z z; // { dg-error "uninitialized reference member|uninitialized const member" }
}
void f16 ()
{
U u; // { dg-error "uninitialized const member" }
}