Commit 816551fe by Fabien Chêne

re PR c++/52369 (Const-qualified non-class base member and defaulted default constructor)

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
parent c288ec8f
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> 2014-03-25 Jason Merrill <jason@redhat.com>
PR c++/60566 PR c++/60566
......
...@@ -2157,7 +2157,7 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ...@@ -2157,7 +2157,7 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
"of %q#T", DECL_CONTEXT (field), origin); "of %q#T", DECL_CONTEXT (field), origin);
} }
inform (DECL_SOURCE_LOCATION (field), 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, ...@@ -2185,7 +2185,7 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin,
"of %q#T", DECL_CONTEXT (field), origin); "of %q#T", DECL_CONTEXT (field), origin);
} }
inform (DECL_SOURCE_LOCATION (field), inform (DECL_SOURCE_LOCATION (field),
"%qD should be initialized", field); "%q#D should be initialized", field);
} }
} }
......
...@@ -1110,15 +1110,23 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk, ...@@ -1110,15 +1110,23 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk,
&& default_init_uninitialized_part (mem_type)) && default_init_uninitialized_part (mem_type))
{ {
if (diag) 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; bad = true;
} }
else if (TREE_CODE (mem_type) == REFERENCE_TYPE) else if (TREE_CODE (mem_type) == REFERENCE_TYPE)
{ {
if (diag) 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; bad = true;
} }
......
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> 2014-03-26 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/60636 PR sanitizer/60636
......
// 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" }
}
// 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" }
}
// PR c++/29039 // PR c++/29039
typedef struct S { // { dg-error "reference" "" { target c++11 } } typedef struct S { // { dg-error "reference" "" { target c++11 } }
int &r; int &r;
}; // { dg-warning "'typedef' was ignored" } }; // { dg-warning "'typedef' was ignored" }
......
// PR c++/25811 // PR c++/25811
// { dg-do compile } // { 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& ref; // { dg-message "should be initialized" }
int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } 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 const i; // { dg-message "should be initialized" }
T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } T& ref; // { dg-message "should be initialized" }
}; };
struct X struct X
...@@ -55,44 +64,50 @@ struct X ...@@ -55,44 +64,50 @@ struct X
int const& r; 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]; 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]; 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 struct Z5
...@@ -100,7 +115,7 @@ struct Z5 ...@@ -100,7 +115,7 @@ struct Z5
int i; int i;
}; };
struct Z // { dg-error "deleted" "" { target c++11 } } struct Z // { dg-error "deleted" "" { target c++11 } }
{ {
Z1 z1; Z1 z1;
Z2 z2; Z2 z2;
...@@ -109,9 +124,10 @@ struct Z // { dg-error "deleted" "" { target c++11 } } ...@@ -109,9 +124,10 @@ struct Z // { dg-error "deleted" "" { target c++11 } }
Z5 z5; 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 () void f1 ()
......
// PR c++/29043 // PR c++/29043
// { dg-do compile } // { 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 class C
...@@ -13,9 +14,10 @@ public: ...@@ -13,9 +14,10 @@ public:
S s; 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 class C2
...@@ -33,9 +35,10 @@ class C3 ...@@ -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 struct C4
...@@ -46,7 +49,7 @@ struct C4 ...@@ -46,7 +49,7 @@ struct C4
struct C5 struct C5
{ {
C5() {} // { dg-message "uninitialized" } C5() {} // { dg-error "uninitialized" }
int const iit[ 1 ]; int const iit[ 1 ];
}; };
// PR c++/43719 // PR c++/43719
// { dg-do compile } // { 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& ref; // { dg-message "should be initialized" }
int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } 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-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 } } 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 } } 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 } } template <class T> struct S4 // { 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" }
T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } T& ref; // { dg-message "should be initialized" }
}; };
struct X struct X
...@@ -55,9 +55,9 @@ struct X ...@@ -55,9 +55,9 @@ struct X
int const& r; 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 } } struct Y1 // { dg-error "deleted" "" { target c++11 } }
...@@ -65,9 +65,9 @@ struct Y1 // { dg-error "deleted" "" { target c++11 } } ...@@ -65,9 +65,9 @@ struct Y1 // { dg-error "deleted" "" { target c++11 } }
Y11 a[1]; 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 } } struct Y2 // { dg-error "deleted" "" { target c++11 } }
...@@ -75,24 +75,24 @@ struct Y2 // { dg-error "deleted" "" { target c++11 } } ...@@ -75,24 +75,24 @@ struct Y2 // { dg-error "deleted" "" { target c++11 } }
Y22 a[1]; 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 struct Z5
...@@ -109,9 +109,9 @@ struct Z // { dg-error "deleted" "" { target c++11 } } ...@@ -109,9 +109,9 @@ struct Z // { dg-error "deleted" "" { target c++11 } }
Z5 z5; 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" }
}; };
......
// PR c++/44086 // PR c++/44086
// { dg-do compile } // { 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() void f()
......
// PR c++/58126 // PR c++/58126
struct A { // { dg-error "uninitialized" "" { target c++11 } } struct A { // { dg-error "uninitialized" "" { target c++11 } }
const int value1; const int value1; // { dg-message "should be initialized" }
int& value2; int& value2; // { dg-message "should be initialized" }
}; };
struct B : A { }; // { dg-error "deleted" "" { target c++11 } } struct B : A { }; // { dg-error "deleted" "" { target c++11 } }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment