search.c (lookup_field_r): If looking for type and non-TYPE_DECL is found...

* search.c (lookup_field_r): If looking for type and non-TYPE_DECL
	is found, look first if name does not match the structure name.

	* g++.old-deja/g++.other/lookup23.C: New test.

From-SVN: r41447
This commit is contained in:
Jakub Jelinek 2001-04-20 10:13:59 +02:00 committed by Jakub Jelinek
parent d40cd80a97
commit 881cae050a
4 changed files with 43 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2001-04-20 Jakub Jelinek <jakub@redhat.com>
* search.c (lookup_field_r): If looking for type and non-TYPE_DECL
is found, look first if name does not match the structure name.
2001-04-19 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (DECL_LANGUAGE): Don't assume DECL_LANG_SPECIFIC is

View File

@ -1384,11 +1384,27 @@ lookup_field_r (binfo, data)
we ignore all non-types we find. */
if (lfi->want_type && TREE_CODE (nval) != TYPE_DECL)
{
nval = purpose_member (lfi->name, CLASSTYPE_TAGS (type));
if (nval)
nval = TYPE_MAIN_DECL (TREE_VALUE (nval));
else
return NULL_TREE;
if (lfi->name == TYPE_IDENTIFIER (type))
{
/* If the aggregate has no user defined constructors, we allow
it to have fields with the same name as the enclosing type.
If we are looking for that name, find the corresponding
TYPE_DECL. */
for (nval = TREE_CHAIN (nval); nval; nval = TREE_CHAIN (nval))
if (DECL_NAME (nval) == lfi->name
&& TREE_CODE (nval) == TYPE_DECL)
break;
}
else
nval = NULL_TREE;
if (!nval)
{
nval = purpose_member (lfi->name, CLASSTYPE_TAGS (type));
if (nval)
nval = TYPE_MAIN_DECL (TREE_VALUE (nval));
else
return NULL_TREE;
}
}
/* You must name a template base class with a template-id. */

View File

@ -1,3 +1,7 @@
2001-04-20 Jakub Jelinek <jakub@redhat.com>
* g++.old-deja/g++.other/lookup23.C: New test.
2001-04-20 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20010403-1.c: New test.

View File

@ -0,0 +1,13 @@
// Test for proper handling of type lookup if base class has field with the
// same name as the containing class.
// Build don't link:
struct a { int a; };
struct b : a {};
b x;
void foo ()
{
x.a = 22;
}