Commit ae4a4c88 by Tom Tromey Committed by Tom Tromey

expr.c (lookup_field): Print error and return error_mark_node if field reference is ambiguous.

	* expr.c (lookup_field): Print error and return error_mark_node if
	field reference is ambiguous.

From-SVN: r34698
parent 120f0c10
2000-06-24 Tom Tromey <tromey@cygnus.com> 2000-06-24 Tom Tromey <tromey@cygnus.com>
* expr.c (lookup_field): Print error and return error_mark_node if
field reference is ambiguous.
* parse.y (check_abstract_method_definitions): Also check if * parse.y (check_abstract_method_definitions): Also check if
`other_method' is abstract. `other_method' is abstract.
......
...@@ -1315,7 +1315,8 @@ expand_java_binop (type, op) ...@@ -1315,7 +1315,8 @@ expand_java_binop (type, op)
/* Lookup the field named NAME in *TYPEP or its super classes. /* Lookup the field named NAME in *TYPEP or its super classes.
If not found, return NULL_TREE. If not found, return NULL_TREE.
(If the *TYPEP is not found, return error_mark_node.) (If the *TYPEP is not found, or if the field reference is
ambiguous, return error_mark_node.)
If found, return the FIELD_DECL, and set *TYPEP to the If found, return the FIELD_DECL, and set *TYPEP to the
class containing the field. */ class containing the field. */
...@@ -1334,6 +1335,7 @@ lookup_field (typep, name) ...@@ -1334,6 +1335,7 @@ lookup_field (typep, name)
do do
{ {
tree field, basetype_vec; tree field, basetype_vec;
tree save_field;
int n, i; int n, i;
for (field = TYPE_FIELDS (*typep); field; field = TREE_CHAIN (field)) for (field = TYPE_FIELDS (*typep); field; field = TREE_CHAIN (field))
...@@ -1353,12 +1355,30 @@ lookup_field (typep, name) ...@@ -1353,12 +1355,30 @@ lookup_field (typep, name)
/* Process implemented interfaces. */ /* Process implemented interfaces. */
basetype_vec = TYPE_BINFO_BASETYPES (*typep); basetype_vec = TYPE_BINFO_BASETYPES (*typep);
n = TREE_VEC_LENGTH (basetype_vec); n = TREE_VEC_LENGTH (basetype_vec);
save_field = NULL_TREE;
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)); tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i));
if ((field = lookup_field (&t, name))) if ((field = lookup_field (&t, name)))
return field; {
if (save_field == NULL_TREE)
save_field = field;
else
{
tree i1 = DECL_CONTEXT (save_field);
tree i2 = DECL_CONTEXT (field);
error ("reference `%s' is ambiguous: appears in interface `%s' and interface `%s'",
IDENTIFIER_POINTER (name),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (i1))),
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (i2))));
return error_mark_node;
}
}
} }
if (save_field != NULL_TREE)
return save_field;
*typep = CLASSTYPE_SUPER (*typep); *typep = CLASSTYPE_SUPER (*typep);
} while (*typep); } while (*typep);
return NULL_TREE; return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment