diff options
| author | apbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-31 06:05:29 +0000 |
|---|---|---|
| committer | apbianco <apbianco@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-05-31 06:05:29 +0000 |
| commit | 570653203b2ad83c0ff392e5b6ccc8efec4fe6a6 (patch) | |
| tree | 12fb4498d39e76f2172cd224ddf4b790d45dc6f7 | |
| parent | f806fb683d205a13e330b5f619dba4ed76096bcb (diff) | |
| download | ppe42-gcc-570653203b2ad83c0ff392e5b6ccc8efec4fe6a6.tar.gz ppe42-gcc-570653203b2ad83c0ff392e5b6ccc8efec4fe6a6.zip | |
2001-04-27 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* parse.y (do_resolve_class): Check for cyclic inheritance during
inner class resolution.
(http://gcc.gnu.org/ml/gcc-patches/2001-04/msg01330.html)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42737 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/java/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/java/parse.y | 27 |
2 files changed, 26 insertions, 6 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 70a50eb4eae..95b7445e5d2 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -100,6 +100,11 @@ * verify.c (verify_jvm_instructions): Initialize variable. +2001-04-27 Bryce McKinlay <bryce@waitaki.otago.ac.nz> + + * parse.y (do_resolve_class): Check for cyclic inheritance during + inner class resolution. + 2001-04-27 Per Bothner <per@bothner.com> * parse.y (java_expand_classes): Don't change ctxp_for_generation diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 10283b50562..2b0038b6961 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -5522,13 +5522,14 @@ tree do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { - tree new_class_decl; + tree new_class_decl, super, start; /* Do not try to replace TYPE_NAME (class_type) by a variable, since it is changed by find_in_imports{_on_demand} and (but it doesn't really matter) qualify_and_find */ /* 0- Search in the current class as an inner class */ + start = enclosing; /* Maybe some code here should be added to load the class or something, at least if the class isn't an inner class and ended @@ -5551,14 +5552,28 @@ do_resolve_class (enclosing, class_type, decl, cl) } /* Now go to the upper classes, bail out if necessary. */ - enclosing = CLASSTYPE_SUPER (TREE_TYPE (enclosing)); - if (!enclosing || enclosing == object_type_node) + super = CLASSTYPE_SUPER (TREE_TYPE (enclosing)); + if (!super || super == object_type_node) break; - if (TREE_CODE (enclosing) == POINTER_TYPE) - enclosing = do_resolve_class (NULL, enclosing, NULL, NULL); + if (TREE_CODE (super) == POINTER_TYPE) + super = do_resolve_class (NULL, super, NULL, NULL); else - enclosing = TYPE_NAME (enclosing); + super = TYPE_NAME (super); + + /* We may not have checked for circular inheritance yet, so do so + here to prevent an infinite loop. */ + if (super == start) + { + if (!cl) + cl = lookup_cl (decl); + + parse_error_context + (cl, "Cyclic inheritance involving %s", + IDENTIFIER_POINTER (DECL_NAME (enclosing))); + break; + } + enclosing = super; } /* 1- Check for the type in single imports. This will change |

