re PR c++/43719 (uninitialized const member incorrectly accepted, using an array)
authorFabien Chêne <fabien.chene@gmail.com>
Mon, 10 May 2010 18:37:45 +0000 (18:37 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 10 May 2010 18:37:45 +0000 (14:37 -0400)
PR c++/43719
* decl.c (check_initializer): strip array type before checking for
uninitialized const or ref members.

From-SVN: r159242

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/anon-struct4.C
gcc/testsuite/g++.dg/init/pr43719.C [new file with mode: 0644]

index d41a95fcccd8b55e13d5313bfc4cc52b6f7f32bf..c62f817e53a947bfd496bbd669be64bbb0091819 100644 (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
index 70b1041284a437d7a69e72c38082a178a637ec4a..4aa34418020080296ebab1144e40e7baf3d97397 100644 (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);
     }
index 824920b41351283aa955d4dfe4083d608bcd526a..7f76632a802af4d1e709806b647f915fe1529a08 100644 (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
index 4f0fcd12b77f3f1d78f2386763a1a7246cc61bc2..fa5bd4b3d8a8da65b568e8652b625984541ab059 100644 (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 }
diff --git a/gcc/testsuite/g++.dg/init/pr43719.C b/gcc/testsuite/g++.dg/init/pr43719.C
new file mode 100644 (file)
index 0000000..d3487c9
--- /dev/null
@@ -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" }
+}
+