From fe1e249372a97b8dca0b3f17c4a698910fed4f8f Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 15 Feb 2013 01:27:03 +0000 Subject: [PATCH] PR c++/56323 * name-lookup.c (do_class_using_decl): Handle typedefs with inheriting constructors. (push_class_level_binding_1): Allow inheriting from template template parameter, too. * pt.c (tsubst_decl) [USING_DECL]: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196067 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++ gcc/cp/name-lookup.c | 11 +++++--- gcc/cp/pt.c | 3 ++- gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C | 45 +++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index de03a7a..76cefcf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2013-02-14 Jason Merrill + PR c++/56323 + * name-lookup.c (do_class_using_decl): Handle typedefs with + inheriting constructors. + (push_class_level_binding_1): Allow inheriting from template + template parameter, too. + * pt.c (tsubst_decl) [USING_DECL]: Likewise. + PR c++/55223 * pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Fix handling of default argument scope. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 074dcf3..1f3c042 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -3028,11 +3028,10 @@ push_class_level_binding_1 (tree name, tree x) decl = TREE_VALUE (decl); if (TREE_CODE (decl) == USING_DECL - && TREE_CODE (USING_DECL_SCOPE (decl)) == TEMPLATE_TYPE_PARM + && TYPE_NAME (USING_DECL_SCOPE (decl)) && DECL_NAME (decl) == TYPE_IDENTIFIER (USING_DECL_SCOPE (decl))) - /* This using-declaration declares constructors that inherit from the - constructors for the template parameter. It does not redeclare the - name of the template parameter. */ + /* This using-declaration declares inheriting constructors; it does not + redeclare the name of a template parameter. */ return true; if (!check_template_shadow (decl)) @@ -3226,6 +3225,10 @@ do_class_using_decl (tree scope, tree name) error ("%<%T::%D%> names destructor", scope, name); return NULL_TREE; } + if (TYPE_NAME (scope) && name == TYPE_IDENTIFIER (scope)) + /* 3.4.3.1 says that using B::B always names the constructor even if B + is a typedef; now replace the second B with the real name. */ + name = TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (scope)); if (MAYBE_CLASS_TYPE_P (scope) && constructor_name_p (name, scope)) maybe_warn_cpp0x (CPP0X_INHERITING_CTORS); if (constructor_name_p (name, current_class_type)) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index aa868a4..e88ea85 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10492,7 +10492,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) tree inst_scope = tsubst_copy (USING_DECL_SCOPE (t), args, complain, in_decl); tree name = tsubst_copy (DECL_NAME (t), args, complain, in_decl); - if (TREE_CODE (scope) == TEMPLATE_TYPE_PARM + /* Handle 'using T::T'. */ + if (TYPE_NAME (scope) && name == TYPE_IDENTIFIER (scope)) name = TYPE_IDENTIFIER (inst_scope); r = do_class_using_decl (inst_scope, name); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C new file mode 100644 index 0000000..22eda3a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor17.C @@ -0,0 +1,45 @@ +// PR c++/56323 +// { dg-do compile { target c++11 } } + +struct A { + A(int i); +}; + +typedef A B; + +struct C : B { + using B::B; +}; + +struct D : B { + using B::A; +}; + +C c(0); +D d(0); + +template +struct E { + typedef T type; +}; + +template +struct F : E::type { + using E::type::type; // error: E::type is a typedef +}; + +F f(0); + +template +struct AT +{ + AT(T); +}; + +template