aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/parse.y
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>2001-04-26 12:40:34 -0700
committerPer Bothner <bothner@gcc.gnu.org>2001-04-26 12:40:34 -0700
commit56fe39c8097aaa80cdc48131b54c6187c652a4d9 (patch)
treec06f55dbae48157d5f980adcc95f3149baa89b43 /gcc/java/parse.y
parent52a661a6277cf517aa56b013c83d204982fab9c8 (diff)
downloadgcc-56fe39c8097aaa80cdc48131b54c6187c652a4d9.zip
gcc-56fe39c8097aaa80cdc48131b54c6187c652a4d9.tar.gz
gcc-56fe39c8097aaa80cdc48131b54c6187c652a4d9.tar.bz2
Fix method search wrt scope of inner classes to match JLS2.
From-SVN: r41604
Diffstat (limited to 'gcc/java/parse.y')
-rw-r--r--gcc/java/parse.y46
1 files changed, 24 insertions, 22 deletions
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index fb22d81..a8084ee 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -9882,7 +9882,29 @@ patch_method_invocation (patch, primary, where, from_super,
alternate class is specified. */
else
{
- class_to_search = (where ? where : current_class);
+ if (where != NULL_TREE)
+ class_to_search = where;
+ else if (QUALIFIED_P (name))
+ class_to_search = current_class;
+ else
+ {
+ class_to_search = current_class;
+
+ for (;;)
+ {
+ if (has_method (class_to_search, name))
+ break;
+ if (! INNER_CLASS_TYPE_P (class_to_search))
+ {
+ parse_error_context (wfl,
+ "No method named `%s' in scope",
+ IDENTIFIER_POINTER (name));
+ PATCH_METHOD_RETURN_ERROR ();
+ }
+ class_to_search
+ = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class_to_search)));
+ }
+ }
lc = 0;
}
@@ -10488,8 +10510,6 @@ find_applicable_accessible_methods_list (lc, class, name, arglist)
/* Search classes */
else
{
- tree sc = class;
- int seen_inner_class = 0;
search_applicable_methods_list (lc, TYPE_METHODS (class),
name, arglist, &list, &all_list);
@@ -10506,7 +10526,7 @@ find_applicable_accessible_methods_list (lc, class, name, arglist)
/* We must search all interfaces of this class */
if (!lc)
{
- tree basetype_vec = TYPE_BINFO_BASETYPES (sc);
+ tree basetype_vec = TYPE_BINFO_BASETYPES (class);
int n = TREE_VEC_LENGTH (basetype_vec), i;
for (i = 1; i < n; i++)
{
@@ -10521,24 +10541,6 @@ find_applicable_accessible_methods_list (lc, class, name, arglist)
}
}
- /* Search enclosing context of inner classes before looking
- ancestors up. */
- while (!lc && INNER_CLASS_TYPE_P (class))
- {
- tree rlist;
- seen_inner_class = 1;
- class = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class)));
- rlist = find_applicable_accessible_methods_list (lc, class,
- name, arglist);
- list = chainon (rlist, list);
- }
-
- if (!lc && seen_inner_class
- && TREE_TYPE (DECL_CONTEXT (TYPE_NAME (sc))) == CLASSTYPE_SUPER (sc))
- class = CLASSTYPE_SUPER (sc);
- else
- class = sc;
-
/* Search superclass */
if (!lc && CLASSTYPE_SUPER (class) != NULL_TREE)
{