decl.c (lookup_name_real): Don't forget the TYPENAME_TYPE we're looking inside.

* decl.c (lookup_name_real): Don't forget the TYPENAME_TYPE we're
        looking inside.

From-SVN: r35650
This commit is contained in:
Jason Merrill 2000-08-11 20:02:49 -04:00 committed by Jason Merrill
parent 058557c4d1
commit e69c807271
3 changed files with 45 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2000-08-11 Jason Merrill <jason@redhat.com>
* decl.c (lookup_name_real): Don't forget the TYPENAME_TYPE we're
looking inside.
2000-08-11 Nathan Sidwell <nathan@codesourcery.com>
* cp-tree.h (resolve_scope_to_name): Remove unused prototype.

View File

@ -5898,6 +5898,13 @@ lookup_name_real (name, prefer_type, nonclass, namespaces_only)
{
val = lookup_member (type, name, 0, prefer_type);
type_access_control (type, val);
/* Restore the containing TYPENAME_TYPE if we looked
through it before. */
if (got_scope && got_scope != type
&& val && TREE_CODE (val) == TYPE_DECL
&& TREE_CODE (TREE_TYPE (val)) == TYPENAME_TYPE)
TYPE_CONTEXT (TREE_TYPE (val)) = got_scope;
}
}
else

View File

@ -0,0 +1,32 @@
// Bug: g++ forgets about the instantiation of class1 when looking up
// class11_value, and tries to look things up in class1<class2>.
// Special g++ Options:
template<class ItIsInt>
struct class1 {
struct class11 {
typedef ItIsInt class11_value;
};
};
template<class ItIsClass2>
struct class3 {
int f();
};
template<class ItIsClass2>
int class3<ItIsClass2>::f()
{
return class1<typename ItIsClass2::class2_value>::class11::class11_value(10);
}
struct class2 {
typedef int class2_value;
};
int main()
{
class3<class2> the_class3;
the_class3.f();
}