parse.y (do_resolve_class): Check for cyclic inheritance during inner class resolution.
authorBryce McKinlay <bryce@waitaki.otago.ac.nz>
Thu, 31 May 2001 06:05:29 +0000 (06:05 +0000)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Thu, 31 May 2001 06:05:29 +0000 (23:05 -0700)
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)

From-SVN: r42737

gcc/java/ChangeLog
gcc/java/parse.y

index 70a50eb4eaec6efdfd57a18c8808c706fc7700b8..95b7445e5d2b0e70d636ec0b47ca7e52fe02f8b4 100644 (file)
 
        * 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
index 10283b50562ac7d61a59a3e84973a6152fa52a10..2b0038b69618c93ec05b4ce56224cd274f0b3054 100644 (file)
@@ -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