From 7363fb1a2aad74d5edca742efff4828f6d4c6479 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 19 Nov 2012 14:05:59 +0000 Subject: [PATCH] * class.c (one_inheriting_sig): Don't inherit base copy ctors. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193623 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 2 ++ gcc/cp/class.c | 18 +++++++++++------- gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 088959f7f46..06eec9584ec 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,7 @@ 2012-11-19 Jason Merrill + * class.c (one_inheriting_sig): Don't inherit base copy ctors. + PR c++/55262 * method.c (implicitly_declare_fn): Set DECL_PARM_INDEX on the parms of an inheriting ctor. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 04f9df5a23a..da511e2aad2 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -2886,15 +2886,19 @@ static void one_inheriting_sig (tree t, tree ctor, tree *parms, int nparms) { /* We don't declare an inheriting ctor that would be a default, - copy or move ctor. */ - if (nparms == 0 - || (nparms == 1 - && TREE_CODE (parms[0]) == REFERENCE_TYPE - && TYPE_MAIN_VARIANT (TREE_TYPE (parms[0])) == t)) + copy or move ctor for derived or base. */ + if (nparms == 0) return; - int i; + if (nparms == 1 + && TREE_CODE (parms[0]) == REFERENCE_TYPE) + { + tree parm = TYPE_MAIN_VARIANT (TREE_TYPE (parms[0])); + if (parm == t || parm == DECL_CONTEXT (ctor)) + return; + } + tree parmlist = void_list_node; - for (i = nparms - 1; i >= 0; i--) + for (int i = nparms - 1; i >= 0; i--) parmlist = tree_cons (NULL_TREE, parms[i], parmlist); tree fn = implicitly_declare_fn (sfk_inheriting_constructor, t, false, ctor, parmlist); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C new file mode 100644 index 00000000000..cc105581080 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C @@ -0,0 +1,15 @@ +// Discussions on the core reflector indicate that not inheriting base copy +// constructors was a deliberate choice. + +// { dg-options -std=c++11 } + +struct A { A(int); }; +struct B: public A +{ + using A::A; +}; + +A a (42); + +B b1 (24); // inherited +B b2 (a); // not inherited { dg-error "no match" } -- 2.11.4.GIT