diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/class.c | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 42 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/uninitialized1.C | 12 |
5 files changed, 66 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6f6d836..fc2ec31 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,14 @@ 2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> + 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 <paolo.carlini@oracle.com> + PR c++/56060 * pt.c (type_dependent_expression_p): Handle EXPR_PACK_EXPANSION. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9e0229f..c587e55 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 70e7294..d18dc5e 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 %<new%> without new-initializer", origin); + if (DECL_CONTEXT (field) == origin) + { + if (using_new) + error ("uninitialized reference member in %q#T " + "using %<new%> 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 %<new%> 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 %<new%> without new-initializer", origin); + if (DECL_CONTEXT (field) == origin) + { + if (using_new) + error ("uninitialized const member in %q#T " + "using %<new%> 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 %<new%> 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 bc86765..016545a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/58126 + * g++.dg/init/uninitialized1.C: New. + +2013-10-06 Paolo Carlini <paolo.carlini@oracle.com> + PR c++/56060 * g++.dg/cpp0x/variadic144.C: New. diff --git a/gcc/testsuite/g++.dg/init/uninitialized1.C b/gcc/testsuite/g++.dg/init/uninitialized1.C new file mode 100644 index 0000000..200c424 --- /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'" } |