From: Paolo Carlini Date: Sun, 6 Oct 2013 21:41:19 +0000 (+0000) Subject: re PR c++/58126 (No diagnostic when inheriting an uninitialized const or reference... X-Git-Tag: releases/gcc-4.9.0~3696 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0e02d8e3759562d76f6299916b36b35a230e1148;p=thirdparty%2Fgcc.git re PR c++/58126 (No diagnostic when inheriting an uninitialized const or reference member) /cp 2013-10-06 Paolo Carlini PR c++/58126 * class.c (check_bases): Propagate CLASSTYPE_READONLY_FIELDS_NEED_INIT and CLASSTYPE_REF_FIELDS_NEED_INIT from bases to derived. * init.c (diagnose_uninitialized_cst_or_ref_member_1): Extend error messages about uninitialized const and references members to mention the base class. /testsuite 2013-10-06 Paolo Carlini PR c++/58126 * g++.dg/init/uninitialized1.C: New. From-SVN: r203232 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6f6d83681166..fc2ec31c551f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2013-10-06 Paolo Carlini + + PR c++/58126 + * class.c (check_bases): Propagate CLASSTYPE_READONLY_FIELDS_NEED_INIT + and CLASSTYPE_REF_FIELDS_NEED_INIT from bases to derived. + * init.c (diagnose_uninitialized_cst_or_ref_member_1): Extend error + messages about uninitialized const and references members to mention + the base class. + 2013-10-06 Paolo Carlini PR c++/56060 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9e0229fcba37..c587e55ac681 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1517,6 +1517,12 @@ check_bases (tree t, |= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype); TYPE_HAS_COMPLEX_DFLT (t) |= (!TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype) || TYPE_HAS_COMPLEX_DFLT (basetype)); + SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT + (t, CLASSTYPE_READONLY_FIELDS_NEED_INIT (t) + | CLASSTYPE_READONLY_FIELDS_NEED_INIT (basetype)); + SET_CLASSTYPE_REF_FIELDS_NEED_INIT + (t, CLASSTYPE_REF_FIELDS_NEED_INIT (t) + | CLASSTYPE_REF_FIELDS_NEED_INIT (basetype)); /* A standard-layout class is a class that: ... diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 70e7294c4d35..d18dc5e8deb9 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2120,11 +2120,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ++ error_count; if (complain) { - if (using_new) - error ("uninitialized reference member in %q#T " - "using % without new-initializer", origin); + if (DECL_CONTEXT (field) == origin) + { + if (using_new) + error ("uninitialized reference member in %q#T " + "using % without new-initializer", origin); + else + error ("uninitialized reference member in %q#T", origin); + } else - error ("uninitialized reference member in %q#T", origin); + { + if (using_new) + error ("uninitialized reference member in base %q#T " + "of %q#T using % without new-initializer", + DECL_CONTEXT (field), origin); + else + error ("uninitialized reference member in base %q#T " + "of %q#T", DECL_CONTEXT (field), origin); + } inform (DECL_SOURCE_LOCATION (field), "%qD should be initialized", field); } @@ -2135,11 +2148,24 @@ diagnose_uninitialized_cst_or_ref_member_1 (tree type, tree origin, ++ error_count; if (complain) { - if (using_new) - error ("uninitialized const member in %q#T " - "using % without new-initializer", origin); + if (DECL_CONTEXT (field) == origin) + { + if (using_new) + error ("uninitialized const member in %q#T " + "using % without new-initializer", origin); + else + error ("uninitialized const member in %q#T", origin); + } else - error ("uninitialized const member in %q#T", origin); + { + if (using_new) + error ("uninitialized const member in base %q#T " + "of %q#T using % without new-initializer", + DECL_CONTEXT (field), origin); + else + error ("uninitialized const member in base %q#T " + "of %q#T", DECL_CONTEXT (field), origin); + } inform (DECL_SOURCE_LOCATION (field), "%qD should be initialized", field); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bc867655d7d2..016545a54bd9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-06 Paolo Carlini + + PR c++/58126 + * g++.dg/init/uninitialized1.C: New. + 2013-10-06 Paolo Carlini PR c++/56060 diff --git a/gcc/testsuite/g++.dg/init/uninitialized1.C b/gcc/testsuite/g++.dg/init/uninitialized1.C new file mode 100644 index 000000000000..200c424305d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/uninitialized1.C @@ -0,0 +1,12 @@ +// PR c++/58126 + +struct A { + const int value1; + int& value2; +}; + +struct B : A { }; + +A a; // { dg-error "uninitialized const member in 'struct A'|uninitialized reference member in 'struct A'" } + +B b; // { dg-error "uninitialized const member in base 'struct A' of 'struct B'|uninitialized reference member in base 'struct A' of 'struct B'" }