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:
parent
d40cd80a97
commit
881cae050a
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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.
|
||||
|
13
gcc/testsuite/g++.old-deja/g++.other/lookup23.C
Normal file
13
gcc/testsuite/g++.old-deja/g++.other/lookup23.C
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user