re PR c++/52369 (Const-qualified non-class base member and defaulted default constructor)
authorFabien Chêne <fabien@gcc.gnu.org>
Wed, 26 Mar 2014 21:33:28 +0000 (22:33 +0100)
committerFabien Chêne <fabien@gcc.gnu.org>
Wed, 26 Mar 2014 21:33:28 +0000 (22:33 +0100)
2014-03-26  Fabien Chene  <fabien@gcc.gnu.org>
        PR c++/52369
        * cp/method.c (walk_field_subobs): improve the diagnostic
locations for both REFERENCE_TYPEs and non-static const members.
* cp/init.c (diagnose_uninitialized_cst_or_ref_member): use %q#D
instead of %qD to be consistent with the c++11 diagnostic.

2014-03-26  Fabien Chene  <fabien@gcc.gnu.org>

        PR c++/52369
        * g++.dg/init/const10.C: New.
* g++.dg/init/const11.C: New.
* g++.dg/init/pr25811.C: Adjust.
* g++.dg/init/pr29043.C: Likewise.
* g++.dg/init/pr43719.C: Likewise.
* g++.dg/init/pr44086.C: Likewise.
* g++.dg/init/ctor8.C: Likewise.
* g++.dg/init/uninitialized1.C: Likewise.

From-SVN: r208854

12 files changed:
gcc/cp/ChangeLog
gcc/cp/init.c
gcc/cp/method.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/const10.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/const11.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/ctor8.C
gcc/testsuite/g++.dg/init/pr25811.C
gcc/testsuite/g++.dg/init/pr29043.C
gcc/testsuite/g++.dg/init/pr43719.C
gcc/testsuite/g++.dg/init/pr44086.C
gcc/testsuite/g++.dg/init/uninitialized1.C

index 518eb22bb39e13ff92cec9ca46cbacf7953aa0c4..71f94fcf64ff546d20734d522b81a8d839fadbe1 100644 (file)
@@ -1,3 +1,10 @@
+2014-03-26  Fabien Chêne  <fabien@gcc.gnu.org>
+        PR c++/52369
+        * cp/method.c (walk_field_subobs): improve the diagnostic
+       locations for both REFERENCE_TYPEs and non-static const members.
+       * cp/init.c (diagnose_uninitialized_cst_or_ref_member): use %q#D
+       instead of %qD to be consistent with the c++11 diagnostic.
+
 2014-03-25  Jason Merrill  <jason@redhat.com>
 
        PR c++/60566
index 2e1cddef48ace7c8055406d8db00d9114c6409c6..f85776c5ec7581e0df91e875ff62db3131dcee13 100644 (file)
@@ -2157,7 +2157,7 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
                           "of %q#T", DECL_CONTEXT (field), origin);
                }
              inform (DECL_SOURCE_LOCATION (field),
-                     "%qD should be initialized", field);
+                     "%q#D should be initialized", field);
            }
        }
 
@@ -2185,7 +2185,7 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
                           "of %q#T", DECL_CONTEXT (field), origin);
                }
              inform (DECL_SOURCE_LOCATION (field),
-                     "%qD should be initialized", field);
+                     "%q#D should be initialized", field);
            }
        }
 
index d72b564a464010671f9c76a81f7acb095104ee0c..11bff7f45878ece660410341cc9fdc71ce8b24f0 100644 (file)
@@ -1110,15 +1110,23 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
              && default_init_uninitialized_part (mem_type))
            {
              if (diag)
-               error ("uninitialized non-static const member %q#D",
-                      field);
+               {
+                 error ("uninitialized const member in %q#T",
+                        current_class_type);
+                 inform (DECL_SOURCE_LOCATION (field),
+                         "%q#D should be initialized", field);
+               }
              bad = true;
            }
          else if (TREE_CODE (mem_type) == REFERENCE_TYPE)
            {
              if (diag)
-               error ("uninitialized non-static reference member %q#D",
-                      field);
+               {
+                 error ("uninitialized reference member in %q#T",
+                        current_class_type);
+                 inform (DECL_SOURCE_LOCATION (field),
+                         "%q#D should be initialized", field);
+               }
              bad = true;
            }
 
index cdc8e9aa3da0292f523a10f6f8df18edc50b6b1e..a5bcb88b1a8718b2419b666062f82120cf434851 100644 (file)
@@ -1,3 +1,15 @@
+2014-03-26  Fabien Chêne  <fabien@gcc.gnu.org>
+
+        PR c++/52369
+        * g++.dg/init/const10.C: New.
+       * g++.dg/init/const11.C: New.
+       * g++.dg/init/pr25811.C: Adjust.
+       * g++.dg/init/pr29043.C: Likewise.
+       * g++.dg/init/pr43719.C: Likewise.
+       * g++.dg/init/pr44086.C: Likewise.
+       * g++.dg/init/ctor8.C: Likewise.
+       * g++.dg/init/uninitialized1.C: Likewise.
+
 2014-03-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/60636
diff --git a/gcc/testsuite/g++.dg/init/const10.C b/gcc/testsuite/g++.dg/init/const10.C
new file mode 100644 (file)
index 0000000..ecd0db4
--- /dev/null
@@ -0,0 +1,33 @@
+// PR C++/52369
+// { dg-do compile { target c++11 } }
+
+class B // { dg-message "implicitly deleted" }
+        // { dg-error "uninitialized" "" { target c++11 } 4 }
+{
+  int const v_; // { dg-message "should be initialized" }
+};
+
+struct D : B {}; // { dg-error "deleted" }
+
+class A // { dg-message "implicitly deleted" }
+       // { dg-error "uninitialized" "" { target c++11 } 12 }
+{
+  int& ref; // { dg-message "should be initialized" }
+};
+
+struct C : A {}; // { dg-error "deleted" }
+
+void f()
+{
+  D d; // { dg-error "use of deleted" }
+  new D; // { dg-error "use of deleted" }
+  D(); // { dg-error "use of deleted" }
+  new D(); // { dg-error "use of deleted" }
+
+  C c; // { dg-error "use of deleted" }
+  new C; // { dg-error "use of deleted" }
+  C(); // { dg-error "use of deleted" }
+  new C(); // { dg-error "use of deleted" }
+}
+
+
diff --git a/gcc/testsuite/g++.dg/init/const11.C b/gcc/testsuite/g++.dg/init/const11.C
new file mode 100644 (file)
index 0000000..08d5185
--- /dev/null
@@ -0,0 +1,29 @@
+// PR C++/52369
+// { dg-do compile { target { ! c++11 } } }
+
+class B
+{
+  int const v_; // { dg-message "should be initialized" }
+};
+
+struct D : B {};
+
+class A
+{
+  int& ref; // { dg-message "should be initialized" }
+};
+
+struct C : A {};
+
+void f()
+{
+  D d; // { dg-error "uninitialized" }
+  new D; // { dg-error "uninitialized" }
+  D();
+  new D();
+
+  C c; // { dg-error "uninitialized" }
+  new C; // { dg-error "uninitialized" }
+  C(); // { dg-error "value-initialization" }
+  new C(); // { dg-error "value-initialization" }
+}
index 7eb72eb833fc348971b1919a9263230d15e5a2ad..3c37790c0c44bbeb2ed08354550f712507738bde 100644 (file)
@@ -1,6 +1,6 @@
 // PR c++/29039
 
-typedef struct S {         // { dg-error "reference" "" { target c++11 } }
+typedef struct S { // { dg-error "reference" "" { target c++11 } }
   int &r; 
 }; // { dg-warning "'typedef' was ignored" }
 
index 0a462be54715c56c1c50a6fe7d7d086d562058c3..c29f40607bd2a053a3f07894387b55b56ea63146 100644 (file)
@@ -1,51 +1,60 @@
 // PR c++/25811
 // { dg-do compile }
 
-struct A1              // { dg-error "uninitialized" "" { target c++11 } }
+struct A1 // { dg-message "implicitly deleted" "" { target c++11 } }
+          // { dg-error "uninitialized" "" { target c++11 } 4 }
 {
-  int const j; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const j; // { dg-message "should be initialized" }
 };
 
-struct A2              // { dg-error "uninitialized" "" { target c++11 } }
+struct A2 // { dg-message "implicitly deleted" "" { target c++11 } }
+          // { dg-error "uninitialized" "" { target c++11 } 10 }
 {
-  int const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const volatile i; // { dg-message "should be initialized" }
 };
 
-struct A3              // { dg-error "uninitialized" "" { target c++11 } }
+struct A3 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 16 }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
-struct A4              // { dg-error "uninitialized" "" { target c++11 } }
+struct A4 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 22 }
 {
-  int const& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const& ref; // { dg-message "should be initialized" }
 };
 
-struct A5              // { dg-error "uninitialized" "" { target c++11 } }
+struct A5 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 28 }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
+  int const i; // { dg-message "should be initialized" }
 };
 
-template <class T> struct S1 // { dg-error "uninitialized" "" { target c++11 } }
+template <class T> struct S1 // { dg-message "implicitly deleted" "" { target c++11 } }
+                            // { dg-error "uninitialized" "" { target c++11 } 35 }
 {
-  T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T const i; // { dg-message "should be initialized" }
 };
 
-template <class T> struct S2 // { dg-error "uninitialized" "" { target c++11 } }
+template <class T> struct S2 // { dg-message "implicitly deleted" "" { target c++11 } }
+                            // { dg-error "uninitialized" "" { target c++11 } 41 }
 {
-  T const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T const volatile i; // { dg-message "should be initialized" }
 };
 
-template <class T> struct S3 // { dg-error "uninitialized" "" { target c++11 } }
+template <class T> struct S3 // { dg-message "implicitly deleted" "" { target c++11 } }
+                            // { dg-error "uninitialized" "" { target c++11 } 47 }
 {
-  T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T& ref; // { dg-message "should be initialized" }
 };
 
-template <class T> struct S4 // { dg-error "uninitialized" "" { target c++11 } }
+template <class T> struct S4 // { dg-message "implicitly deleted" "" { target c++11 } }
+                            // { dg-error "uninitialized" "" { target c++11 } 53 }
 {
-  T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
-  T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T const i; // { dg-message "should be initialized" }
+  T& ref; // { dg-message "should be initialized" }
 };
 
 struct X
@@ -55,44 +64,50 @@ struct X
   int const& r;
 };
 
-struct Y11             // { dg-error "uninitialized" "" { target c++11 } }
+struct Y11 // { dg-message "implicitly deleted" "" { target c++11 } }
+          // { dg-error "uninitialized" "" { target c++11 } 67 }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
-struct Y1              // { dg-error "deleted" "" { target c++11 } }
+struct Y1 // { dg-error "deleted" "" { target c++11 } }
 {
   Y11 a[1];
 };
 
-struct Y22             // { dg-error "uninitialized" "" { target c++11 } }
+struct Y22 // { dg-message "implicitly deleted" "" { target c++11 } }
+          // { dg-error "uninitialized" "" { target c++11 } 78 }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
-struct Y2              // { dg-error "deleted" "" { target c++11 } }
+struct Y2 // { dg-error "deleted" "" { target c++11 } }
 {
   Y22 a[1];
 };
 
-struct Z1              // { dg-error "uninitialized" "" { target c++11 } }
+struct Z1 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 89 }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
-struct Z2 // { dg-error "uninitialized" "" { target c++11 } }
+struct Z2 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 95 }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
-struct Z3 // { dg-error "uninitialized" "" { target c++11 } }
+struct Z3 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 101 }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
-struct Z4 // { dg-error "uninitialized" "" { target c++11 } }
+struct Z4 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 107 }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
 struct Z5
@@ -100,7 +115,7 @@ struct Z5
   int i;
 };
 
-struct Z               // { dg-error "deleted" "" { target c++11 } }
+struct Z // { dg-error "deleted" "" { target c++11 } }
 {
   Z1 z1;
   Z2 z2;
@@ -109,9 +124,10 @@ struct Z           // { dg-error "deleted" "" { target c++11 } }
   Z5 z5;
 };
 
-union U // { dg-error "uninitialized" "" { target c++11 } }
+union U // { dg-message "implicitly deleted" "" { target c++11 } }
+       // { dg-error "uninitialized" "" { target c++11 } 127 }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
 void f1 ()
index f341f8c8f1ff59829f394ef7448c05d85a0fbf52..c81c39cb0f642425a6537b2a92d25e79a07a88aa 100644 (file)
@@ -1,9 +1,10 @@
 // PR c++/29043
 // { dg-do compile }
 
-struct S               // { dg-error "uninitialized" "" { target c++11 } }
+struct S // { dg-message "implicitly deleted" "" { target c++11 } }
+        // { dg-error "uninitialized" "" { target c++11 } 4 }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
 class C
@@ -13,9 +14,10 @@ public:
   S s;
 };
 
-struct S2              // { dg-error "uninitialized" "" { target c++11 } }
+struct S2 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 17 }
 {
-  int& ref;   // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref;   // { dg-message "should be initialized" }
 };
 
 class C2
@@ -33,9 +35,10 @@ class C3
   };
 };
 
-struct S4              // { dg-error "uninitialized" "" { target c++11 } }
+struct S4 // { dg-message "implicitly deleted" "" { target c++11 } }
+         // { dg-error "uninitialized" "" { target c++11 } 38 }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
 struct C4
@@ -46,7 +49,7 @@ struct C4
 
 struct C5
 {
-  C5() {} // { dg-message "uninitialized" }   
+  C5() {} // { dg-error "uninitialized" }
   int const iit[ 1 ];
 };
 
index 81930d07d1012b582d84727092986c0c581daa1d..c8cebc2de1530a5fa77a0dfc6479213f7be31943 100644 (file)
@@ -1,51 +1,51 @@
 // PR c++/43719
 // { dg-do compile }
 
-struct A1                // { dg-error "uninitialized" "" { target c++11 } }
+struct A1 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const j; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const j; // { dg-message "should be initialized" }
 };
 
-struct A2                // { dg-error "uninitialized" "" { target c++11 } }
+struct A2 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const volatile i; // { dg-message "should be initialized" }
 };
 
-struct A3                // { dg-error "uninitialized" "" { target c++11 } }
+struct A3 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
-struct A4                // { dg-error "uninitialized" "" { target c++11 } }
+struct A4 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const& ref; // { dg-message "should be initialized" }
 };
 
-struct A5                // { dg-error "uninitialized" "" { target c++11 } }
+struct A5 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
+  int const i; // { dg-message "should be initialized" }
 };
 
 template <class T> struct S1 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T const i; // { dg-message "should be initialized" }
 };
 
 template <class T> struct S2 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  T const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T const volatile i; // { dg-message "should be initialized" }
 };
 
 template <class T> struct S3 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T& ref; // { dg-message "should be initialized" }
 };
 
 template <class T> struct S4 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
-  T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  T const i; // { dg-message "should be initialized" }
+  T& ref; // { dg-message "should be initialized" }
 };
 
 struct X
@@ -55,9 +55,9 @@ struct X
   int const& r;
 };
 
-struct Y11               // { dg-error "uninitialized" "" { target c++11 } }
+struct Y11 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
 struct Y1                // { dg-error "deleted" "" { target c++11 } }
@@ -65,9 +65,9 @@ struct Y1               // { dg-error "deleted" "" { target c++11 } }
   Y11 a[1];
 };
 
-struct Y22            // { dg-error "uninitialized" "" { target c++11 } }
+struct Y22 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
 struct Y2                    // { dg-error "deleted" "" { target c++11 } }
@@ -75,24 +75,24 @@ struct Y2                 // { dg-error "deleted" "" { target c++11 } }
   Y22 a[1];
 };
 
-struct Z1              // { dg-error "uninitialized" "" { target c++11 } }
+struct Z1 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
-struct Z2              // { dg-error "uninitialized" "" { target c++11 } }
+struct Z2 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
-struct Z3              // { dg-error "uninitialized" "" { target c++11 } }
+struct Z3 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
-struct Z4              // { dg-error "uninitialized" "" { target c++11 } }
+struct Z4 // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int& ref; // { dg-message "should be initialized" }
 };
 
 struct Z5
@@ -109,9 +109,9 @@ struct Z            // { dg-error "deleted" "" { target c++11 } }
   Z5 z5;
 };
 
-union U                        // { dg-error "uninitialized" "" { target c++11 } }
+union U // { dg-error "uninitialized" "" { target c++11 } }
 {
-  int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+  int const i; // { dg-message "should be initialized" }
 };
 
 
index 96b5bef1ceca72cfda9b35daffb14d9a5d28b234..c3e9d4e56ae27d3f5926b87a209c92b6e702c5a4 100644 (file)
@@ -1,9 +1,9 @@
 // PR c++/44086
 // { dg-do compile }
 
-struct A               // { dg-error "uninitialized" "" { target c++11 } }
+struct A // { dg-error "uninitialized" "" { target c++11 } }
 {
-    int const i : 2; // { dg-message "should be initialized" "" { target { ! c++11 } } }
+    int const i : 2; // { dg-message "should be initialized" }
 };
 
 void f()
index 1e4f7ae84e2eb1be5804a3a0d6a674db263903fb..e8509ff4b70fbb8f0c5257eb62931037f53656ae 100644 (file)
@@ -1,8 +1,8 @@
 // PR c++/58126
 
-struct A {             // { dg-error "uninitialized" "" { target c++11 } }
-  const int value1;
-  int& value2;
+struct A { // { dg-error "uninitialized" "" { target c++11 } }
+  const int value1; // { dg-message "should be initialized" }
+  int& value2; // { dg-message "should be initialized" }
 };
 
 struct B : A { };      // { dg-error "deleted" "" { target c++11 } }