pt.c (retrieve_specialization): Don't get confused by a using-declaration that brings in another instance of...

* pt.c (retrieve_specialization): Don't get confused by a
	using-declaration that brings in another instance of this template
	from a base class.

	* ptree.c (cxx_print_type): Fix logic.

From-SVN: r149247
This commit is contained in:
Jason Merrill 2009-07-04 22:09:15 -04:00 committed by Jason Merrill
parent bf15d4697d
commit eb5c3f052a
5 changed files with 43 additions and 1 deletions

View file

@ -1,5 +1,11 @@
2009-07-04 Jason Merrill <jason@redhat.com>
* pt.c (retrieve_specialization): Don't get confused by a
using-declaration that brings in another instance of this template
from a base class.
* ptree.c (cxx_print_type): Fix logic.
* cp-tree.h (LANG_DECL_FN_CHECK): Fix non-checking version.
PR c++/40619

View file

@ -974,7 +974,10 @@ retrieve_specialization (tree tmpl, tree args, hashval_t hash)
for (fns = VEC_index (tree, methods, idx); fns; fns = OVL_NEXT (fns))
{
tree fn = OVL_CURRENT (fns);
if (DECL_TEMPLATE_INFO (fn) && DECL_TI_TEMPLATE (fn) == tmpl)
if (DECL_TEMPLATE_INFO (fn) && DECL_TI_TEMPLATE (fn) == tmpl
/* using-declarations can add base methods to the method vec,
and we don't want those here. */
&& DECL_CONTEXT (fn) == class_specialization)
return fn;
}
return NULL_TREE;

View file

@ -91,6 +91,10 @@ cxx_print_type (FILE *file, tree node, int indent)
print_node (file, "throws", TYPE_RAISES_EXCEPTIONS (node), indent + 4);
return;
case RECORD_TYPE:
case UNION_TYPE:
break;
default:
return;
}

View file

@ -1,3 +1,7 @@
2009-07-04 Jason Merrill <jason@redhat.com>
* g++.dg/template/using15.C: New.
2009-07-04 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/maxloc_1.f90: New test.

View file

@ -0,0 +1,25 @@
// Reduced from the testcase for c++/29433
template <class T>
struct A: T
{
void f(typename T::type);
using T::f;
void g() { f(1); }
};
template <class T>
struct B: T
{ typedef int type; };
struct C
{
typedef double type;
void f();
};
int main()
{
A<B<A<C> > > a;
a.g();
}