From ae4a4c88d0e354447d47a1e1d33a67e531bfec49 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 25 Jun 2000 17:30:38 +0000 Subject: 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 --- gcc/java/ChangeLog | 3 +++ gcc/java/expr.c | 24 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 10d0a73..9510996 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,5 +1,8 @@ 2000-06-24 Tom Tromey + * 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 `other_method' is abstract. diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 886c0cd..144eee9 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -1315,7 +1315,8 @@ expand_java_binop (type, op) /* Lookup the field named NAME in *TYPEP or its super classes. 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 class containing the field. */ @@ -1334,6 +1335,7 @@ lookup_field (typep, name) do { tree field, basetype_vec; + tree save_field; int n, i; for (field = TYPE_FIELDS (*typep); field; field = TREE_CHAIN (field)) @@ -1353,12 +1355,30 @@ lookup_field (typep, name) /* Process implemented interfaces. */ basetype_vec = TYPE_BINFO_BASETYPES (*typep); n = TREE_VEC_LENGTH (basetype_vec); + save_field = NULL_TREE; for (i = 0; i < n; i++) { tree t = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)); 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); } while (*typep); return NULL_TREE; -- cgit v1.1