From: Dodji Seketeli Date: Tue, 8 Mar 2011 22:20:11 +0000 (+0000) Subject: re PR c++/47957 (Type mismatch when a class derived a same name with template parameter) X-Git-Tag: releases/gcc-4.4.6~90 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5045ce4f3fc099b9083f09119e2f4c40aa312c86;p=thirdparty%2Fgcc.git re PR c++/47957 (Type mismatch when a class derived a same name with template parameter) PR c++/47957 gcc/cp/ * name-lookup.c (binding_to_template_parms_of_scope_p): Only consider scopes of primary template definitions. Adjust comments. gcc/testsuite/ * g++.dg/lookup/template3.C: New test. From-SVN: r170793 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 17fa6f9bab5d..a13ced9edb6a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-03-08 Dodji Seketeli + + * name-lookup.c (binding_to_template_parms_of_scope_p): Only + consider scopes of primary template definitions. Adjust comments. + 2011-03-08 Jason Merrill PR c++/47488 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index d94b4cb9bec4..67f33e6e3174 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -3998,8 +3998,13 @@ qualified_lookup_using_namespace (tree name, tree scope, } /* Subroutine of outer_binding. - Returns TRUE if BINDING is a binding to a template parameter of SCOPE, - FALSE otherwise. */ + + Returns TRUE if BINDING is a binding to a template parameter of + SCOPE. In that case SCOPE is the scope of a primary template + parameter -- in the sense of G++, i.e, a template that has its own + template header. + + Returns FALSE otherwise. */ static bool binding_to_template_parms_of_scope_p (cxx_binding *binding, @@ -4015,6 +4020,8 @@ binding_to_template_parms_of_scope_p (cxx_binding *binding, return (scope && scope->this_entity && get_template_info (scope->this_entity) + && PRIMARY_TEMPLATE_P (TI_TEMPLATE + (get_template_info (scope->this_entity))) && parameter_of_template_p (binding_value, TI_TEMPLATE (get_template_info \ (scope->this_entity)))); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 87e8ac274832..b73c4a4cea25 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-03-08 Dodji Seketeli + + * g++.dg/lookup/template3.C: New test. + 2011-03-06 Jerry DeLisle Backport from mainline diff --git a/gcc/testsuite/g++.dg/lookup/template3.C b/gcc/testsuite/g++.dg/lookup/template3.C new file mode 100644 index 000000000000..e5f6f18edc7d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/template3.C @@ -0,0 +1,35 @@ +// Origin PR c++/47957 +// { dg-do compile } + +struct S +{ + int m; + + S() + : m(0) + { + } +}; + +struct Base +{ + typedef S T; +}; + +template +struct Derived : public Base +{ + int + foo() + { + T a; // This is Base::T, not the template parameter. + return a.m; + } +}; + +int +main() +{ + Derived d; + return d.foo(); +}