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:
parent
1de12eab74
commit
34655c9e68
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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" }
|
||||
}
|
||||
|
Loading…
Reference in New Issue