typeck.c (build_java_array_type): Don't try to poke a public `clone' method into...
authorBryce McKinlay <bryce@albatross.co.nz>
Mon, 19 Feb 2001 21:10:14 +0000 (21:10 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Mon, 19 Feb 2001 21:10:14 +0000 (21:10 +0000)
* typeck.c (build_java_array_type): Don't try to poke a public `clone'
method into array types.
* parse.y (patch_method_invocation): Bypass access check on clone call
to array instance.

From-SVN: r39906

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

index 848fd7ce197212b3c440fa19887db6fdfc5c2d81..f19c3fffc499e5f7199a320c4ff2f198c250db2f 100644 (file)
@@ -1,3 +1,10 @@
+2001-02-18  Bryce McKinlay  <bryce@albatross.co.nz>
+
+       * typeck.c (build_java_array_type): Don't try to poke a public `clone'
+       method into array types.
+       * parse.y (patch_method_invocation): Bypass access check on clone call
+       to array instance.
+       
 2001-02-15  Alexandre Petit-Bianco  <apbianco@redhat.com>
 
        * expr.c (build_instanceof): Check for arrays when trying fold to
index e70b2eb0cd8256ca5bf1df635baf55f94c27d9aa..cb8525a8521462457c426a9d50418efa3deb6c7f 100644 (file)
@@ -9684,6 +9684,7 @@ patch_method_invocation (patch, primary, where, from_super,
   int is_static_flag = 0;
   int is_super_init = 0;
   tree this_arg = NULL_TREE;
+  int is_array_clone_call = 0;
   
   /* Should be overriden if everything goes well. Otherwise, if
      something fails, it should keep this value. It stop the
@@ -9758,6 +9759,9 @@ patch_method_invocation (patch, primary, where, from_super,
       else
        this_arg = primary = resolved;
       
+      if (TYPE_ARRAY_P (type) && identifier == get_identifier ("clone"))
+        is_array_clone_call = 1;
+      
       /* IDENTIFIER_WFL will be used to report any problem further */
       wfl = identifier_wfl;
     }
@@ -9839,6 +9843,10 @@ patch_method_invocation (patch, primary, where, from_super,
          can't be executed then. */
       if (!list)
        PATCH_METHOD_RETURN_ERROR ();
+      
+      if (TYPE_ARRAY_P (class_to_search)
+          && DECL_NAME (list) == get_identifier ("clone"))
+        is_array_clone_call = 1;
 
       /* Check for static reference if non static methods */
       if (check_for_static_method_reference (wfl, patch, list, 
@@ -9909,7 +9917,9 @@ patch_method_invocation (patch, primary, where, from_super,
      return the call */
   if (not_accessible_p (DECL_CONTEXT (current_function_decl), list,
                        (primary ? TREE_TYPE (TREE_TYPE (primary)) : 
-                        NULL_TREE), from_super))
+                        NULL_TREE), from_super)
+      /* Calls to clone() on array types are permitted as a special-case. */
+      && !is_array_clone_call)
     {
       char *fct_name = (char *) IDENTIFIER_POINTER (DECL_NAME (list));
       char *access = java_accstring_lookup (get_access_flags_from_decl (list));