diff options
author | apbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-22 05:25:15 +0000 |
---|---|---|
committer | apbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-22 05:25:15 +0000 |
commit | 93139f2259b393717467af0f543e894f6c4d77a4 (patch) | |
tree | 3ec6f9dedc5c7547f9b4b97ed415f645edd1b217 /gcc | |
parent | a292cb6e4642748066ac372d6f9c36b1b1372221 (diff) | |
download | gcc-93139f2259b393717467af0f543e894f6c4d77a4.tar.gz |
2000-10-31 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (outer_field_access_p): Inherited fields aren't
consider outer fields.
(maybe_build_thisn_access_method): Use
PURE_INNER_CLASS_TYPE_P instead of INNER_CLASS_TYPE_P.
(resolve_expression_name): Trigger an error if a static field
is being accessed as an outer field.
2000-10-24 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.h (INNER_ENCLOSING_SCOPE_CHECK): Check inherited type in
scope.
(http://gcc.gnu.org/ml/gcc-patches/2000-11/msg01217.html)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37645 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/java/parse.h | 7 | ||||
-rw-r--r-- | gcc/java/parse.y | 16 |
3 files changed, 34 insertions, 3 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 8d233cd778f..1bce1cb1f3b 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -127,6 +127,15 @@ Include flags.h. * jv-scan.c (pedantic): New global. +2000-10-31 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * parse.y (outer_field_access_p): Inherited fields aren't + consider outer fields. + (maybe_build_thisn_access_method): Use + PURE_INNER_CLASS_TYPE_P instead of INNER_CLASS_TYPE_P. + (resolve_expression_name): Trigger an error if a static field + is being accessed as an outer field. + 2000-10-29 Alexandre Petit-Bianco <apbianco@cygnus.com> * Make-lang.in (LIBGCJ_ZIP_FILE): Define with `$(prefix)'. @@ -152,6 +161,11 @@ current class. Fixed comment. Fixes gcj/361. +2000-10-24 Alexandre Petit-Bianco <apbianco@cygnus.com> + + * parse.h (INNER_ENCLOSING_SCOPE_CHECK): Check inherited type in + scope. + 2000-10-24 Tom Tromey <tromey@cygnus.com> * lex.c (java_new_lexer): Initialize new fields. Work around diff --git a/gcc/java/parse.h b/gcc/java/parse.h index 17c2bd69010..3db25803138 100644 --- a/gcc/java/parse.h +++ b/gcc/java/parse.h @@ -860,7 +860,12 @@ struct parser_ctxt { && !inherits_from_p (TREE_TYPE (TREE_TYPE (current_this)), \ TREE_TYPE (DECL_CONTEXT (TYPE_NAME (T)))) \ && !common_enclosing_context_p (TREE_TYPE (TREE_TYPE (current_this)), \ - (T))) \ + (T)) \ + && INNER_CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (current_this))) \ + && !inherits_from_p \ + (TREE_TYPE (DECL_CONTEXT \ + (TYPE_NAME (TREE_TYPE (TREE_TYPE (current_this))))),\ + TREE_TYPE (DECL_CONTEXT (TYPE_NAME (T))))) \ /* We don't have a this. */ \ || !current_this)) diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 1e92c2afde7..60d5077c32b 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -7887,6 +7887,11 @@ outer_field_access_p (type, decl) || TREE_CODE (decl) != FIELD_DECL || DECL_CONTEXT (decl) == type) return 0; + + /* If the inner class extends the declaration context of the field + we're try to acces, then this isn't an outer field access */ + if (inherits_from_p (type, DECL_CONTEXT (decl))) + return 0; for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ; type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type)))) @@ -8238,7 +8243,7 @@ maybe_build_thisn_access_method (type) /* If TYPE is a top-level class, no access method is required. If there already is such an access method, bail out. */ - if (CLASS_ACCESS0_GENERATED_P (type) || !INNER_CLASS_TYPE_P (type)) + if (CLASS_ACCESS0_GENERATED_P (type) || !PURE_INNER_CLASS_TYPE_P (type)) return NULL_TREE; /* We generate the method. The method looks like: @@ -8866,7 +8871,14 @@ resolve_expression_name (id, orig) to access a field belonging to an outer class, build the access to the field */ if (!fs && outer_field_access_p (current_class, decl)) - return build_outer_field_access (id, decl); + { + if (CLASS_STATIC (TYPE_NAME (current_class))) + { + static_ref_err (id, DECL_NAME (decl), current_class); + return error_mark_node; + } + return build_outer_field_access (id, decl); + } /* Otherwise build what it takes to access the field */ access = build_field_ref ((fs ? NULL_TREE : current_this), |