Fix for PR java/5758, java/5632:
authorAlexandre Petit-Bianco <apbianco@redhat.com>
Sat, 2 Mar 2002 17:58:05 +0000 (09:58 -0800)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Sat, 2 Mar 2002 17:58:05 +0000 (09:58 -0800)
2002-02-28  Alexandre Petit-Bianco  <apbianco@redhat.com>

Fix for PR java/5758, java/5632:
* jcf-parse.c (load_class): Renamed local variable, consider `.' an
inner-class separator too.
* parse.y (do_resolve_class): New local `decl_result.'
Progressively build a name for what can have been loaded.

From-SVN: r50228

gcc/java/ChangeLog
gcc/java/jcf-parse.c
gcc/java/parse.y

index 9c0219bda56f8115e2d9445e0ff483d7ee9213de..57ad8d4ce771d2f3678327f14a8022ca445b83bc 100644 (file)
@@ -2,6 +2,14 @@
 
        * expr.c (build_java_arraystore_check): Fix formatting.
 
+2002-02-28  Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+       Fix for PR java/5758, java/5632:
+       * jcf-parse.c (load_class): Renamed local variable, consider `.' an
+       inner-class separator too.
+       * parse.y (do_resolve_class): New local `decl_result.'
+       Progressively build a name for what can have been loaded.
+
 2002-02-28  Bryce McKinlay  <bryce@waitaki.otago.ac.nz>
 
        * expr.c (java_array_data_offset): Removed function.
index e85b5781f83967b00c87648d71cf9cc0f747c853..484f79ce7a809005aed054059151b27251d6a776 100644 (file)
@@ -669,20 +669,20 @@ load_class (class_or_name, verbose)
   saved = name;
   while (1)
     {
-      char *dollar;
+      char *separator;
 
       if ((class_loaded = read_class (name)))
        break;
 
       /* We failed loading name. Now consider that we might be looking
-        for a inner class but it's only available in source for in
-        its enclosing context. */
-      if ((dollar = strrchr (IDENTIFIER_POINTER (name), '$')))
+        for a inner class. */
+      if ((separator = strrchr (IDENTIFIER_POINTER (name), '$'))
+         || (separator = strrchr (IDENTIFIER_POINTER (name), '.')))
        {
-         int c = *dollar;
-         *dollar = '\0';
+         int c = *separator;
+         *separator = '\0';
          name = get_identifier (IDENTIFIER_POINTER (name));
-         *dollar = c;
+         *separator = c;
        }
       /* Otherwise, we failed, we bail. */
       else
index d005b4e8f9665ad519ca7657e32289d5dc5adfee..0b5be0921eaba8f50395b9b695bd22cae54f6f1d 100644 (file)
@@ -5745,6 +5745,7 @@ do_resolve_class (enclosing, class_type, decl, cl)
 {
   tree new_class_decl = NULL_TREE, super = NULL_TREE;
   tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
+  tree decl_result;
   struct hash_table _ht, *circularity_hash = &_ht;
 
   /* This hash table is used to register the classes we're going
@@ -5841,9 +5842,32 @@ do_resolve_class (enclosing, class_type, decl, cl)
       if (check_pkg_class_access (TYPE_NAME (class_type), cl, true))
         return NULL_TREE;
     }
-  
+
   /* 6- Last call for a resolution */
-  return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
+  decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
+
+  /* The final lookup might have registered a.b.c into a.b$c If we
+     failed at the first lookup, progressively change the name if
+     applicable and use the matching DECL instead. */
+  if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
+    {
+      tree name = TYPE_NAME (class_type);
+      char *separator;
+      do {
+
+       /* Reach the last '.', and if applicable, replace it by a `$' and
+          see if this exists as a type. */
+       if ((separator = strrchr (IDENTIFIER_POINTER (name), '.')))
+         {
+           int c = *separator;
+           *separator = '$';
+           name = get_identifier (IDENTIFIER_POINTER (name));
+           *separator = c;
+           decl_result = IDENTIFIER_CLASS_VALUE (name);
+         }
+      } while (!decl_result && separator);
+    }
+  return decl_result;
 }
 
 static tree