diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/anon-struct4.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/pr43719.C | 197 |
5 files changed, 216 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d41a95f..c62f817 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 70b1041..4aa3441 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 824920b..7f76632 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/ext/anon-struct4.C b/gcc/testsuite/g++.dg/ext/anon-struct4.C index 4f0fcd1..fa5bd4b 100644 --- a/gcc/testsuite/g++.dg/ext/anon-struct4.C +++ b/gcc/testsuite/g++.dg/ext/anon-struct4.C @@ -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 } diff --git a/gcc/testsuite/g++.dg/init/pr43719.C b/gcc/testsuite/g++.dg/init/pr43719.C new file mode 100644 index 0000000..d3487c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr43719.C @@ -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" } +} + |