diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2008-02-14 18:11:04 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2008-02-14 18:11:04 -0500 |
commit | 8c95264b5cfb3f385f0929b6ff90f4c8d9b94905 (patch) | |
tree | e38dc9a61c36b8f7994dae4ac12fe990e88f1885 /gcc | |
parent | 101e174d2c7f1d97a276cf951bcc6d55ecbcabdd (diff) | |
download | gcc-8c95264b5cfb3f385f0929b6ff90f4c8d9b94905.zip gcc-8c95264b5cfb3f385f0929b6ff90f4c8d9b94905.tar.gz gcc-8c95264b5cfb3f385f0929b6ff90f4c8d9b94905.tar.bz2 |
re PR c++/5645 (gcc warns that pure virtual class not explicitly initialized)
PR c++/5645
PR c++/11159
* class.c (type_has_user_nondefault_constructor): New fn.
* cp-tree.h: Declare it.
* init.c (emit_mem_initializers): Use it for -W warning about
missing base initializer.
Co-Authored-By: Jason Merrill <jason@redhat.com>
From-SVN: r132324
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/class.c | 22 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/init.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wreorder-1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr11159.C | 37 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr5645.C | 32 |
7 files changed, 108 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 275ca4b..3635512 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2008-02-14 Manuel Lopez-Ibanez <manu@gcc.gnu.org> + Jason Merrill <jason@redhat.com> + + PR c++/5645 + PR c++/11159 + * class.c (type_has_user_nondefault_constructor): New fn. + * cp-tree.h: Declare it. + * init.c (emit_mem_initializers): Use it for -W warning about + missing base initializer. + 2008-02-14 Paolo Carlini <pcarlini@suse.de> PR c++/28743 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index a5456c2..1a76816 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4039,6 +4039,28 @@ clone_constructors_and_destructors (tree t) clone_function_decl (OVL_CURRENT (fns), /*update_method_vec_p=*/1); } +/* Returns true iff class T has a user-defined constructor other than + the default constructor. */ + +bool +type_has_user_nondefault_constructor (tree t) +{ + tree fns; + + if (!TYPE_HAS_USER_CONSTRUCTOR (t)) + return false; + + for (fns = CLASSTYPE_CONSTRUCTORS (t); fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + if (!DECL_ARTIFICIAL (fn) + && skip_artificial_parms_for (fn, DECL_ARGUMENTS (fn)) != NULL_TREE) + return true; + } + + return false; +} + /* Remove all zero-width bit-fields from T. */ static void diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 27892b9..81e8861 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4157,6 +4157,7 @@ extern void determine_key_method (tree); extern void check_for_override (tree, tree); extern void push_class_stack (void); extern void pop_class_stack (void); +extern bool type_has_user_nondefault_constructor (tree); /* in cvt.c */ extern tree convert_to_reference (tree, tree, int, int, tree); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 040b335..3e6db24 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -829,12 +829,13 @@ emit_mem_initializers (tree mem_inits) tree subobject = TREE_PURPOSE (mem_inits); tree arguments = TREE_VALUE (mem_inits); - /* If these initializations are taking place in a copy - constructor, the base class should probably be explicitly - initialized. */ + /* If these initializations are taking place in a copy constructor, + the base class should probably be explicitly initialized if there + is a user-defined constructor in the base class (other than the + default constructor, which will be called anyway). */ if (extra_warnings && !arguments && DECL_COPY_CONSTRUCTOR_P (current_function_decl) - && TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (subobject))) + && type_has_user_nondefault_constructor (BINFO_TYPE (subobject))) warning (OPT_Wextra, "%Jbase class %q#T should be explicitly initialized in the " "copy constructor", current_function_decl, BINFO_TYPE (subobject)); diff --git a/gcc/testsuite/g++.dg/warn/Wreorder-1.C b/gcc/testsuite/g++.dg/warn/Wreorder-1.C index bd8113a..940ef4a 100644 --- a/gcc/testsuite/g++.dg/warn/Wreorder-1.C +++ b/gcc/testsuite/g++.dg/warn/Wreorder-1.C @@ -10,5 +10,5 @@ struct T { struct U : virtual public S, virtual public T { U () : T (), S () {} // { dg-warning "" } - U (const U&) : S () {} // { dg-warning "copy" } + U (const U&) : S () {} }; diff --git a/gcc/testsuite/g++.dg/warn/pr11159.C b/gcc/testsuite/g++.dg/warn/pr11159.C new file mode 100644 index 0000000..ed4107a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr11159.C @@ -0,0 +1,37 @@ +// PR c++/11159 : erroneous warning in copy ctor with virtual inheritance +// { dg-do compile } +// { dg-options "-Wall -Wextra" } +struct A +{ + A (); +}; + +struct B : virtual A +{ + B (); +}; + +struct C : virtual A +{ + C (); +}; + +struct D : B, C +{ + D (D const&){} +}; + +template <typename Base> +struct E : Base +{ + E (); + + E (E const &) + : Base () + { + }; +}; + +E<C> foo; +E<C> bar (foo); + diff --git a/gcc/testsuite/g++.dg/warn/pr5645.C b/gcc/testsuite/g++.dg/warn/pr5645.C new file mode 100644 index 0000000..5ca61bd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr5645.C @@ -0,0 +1,32 @@ +// PR5645: gcc warns that pure virtual class not explicitly initialized. +// { dg-do compile } +// { dg-options "-Wall -Wextra" } + +class a { +public: + virtual int f() = 0; + virtual int g() = 0; +}; + +class b : public a { +public: + b(); + b(const b& c); + +protected: + int i; +}; + +b::b() {} + +b::b(const b& c) { // { dg-bogus "base class .class a. should be explicitly initialized in the copy constructor" } + i = c.i; +} + +struct X {}; + +struct Y : X +{ + Y (Y const&) {} +}; + |