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:
parent
bf15d4697d
commit
eb5c3f052a
5 changed files with 43 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
25
gcc/testsuite/g++.dg/template/using15.C
Normal file
25
gcc/testsuite/g++.dg/template/using15.C
Normal 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();
|
||||
}
|
Loading…
Add table
Reference in a new issue