6487370: javac incorrectly gives ambiguity warning with override-equivalent abstract inherited methods
authormcimadamore
Thu, 23 Oct 2008 18:00:05 +0100
changeset 1529 a076d4cd3048
parent 1528 441d4ec466de
child 1530 0cb573a51f92
6487370: javac incorrectly gives ambiguity warning with override-equivalent abstract inherited methods Summary: Javac should not compare erased return types when checking for ambiguity errors during overload resolution Reviewed-by: jjg
langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java
langtools/test/tools/javac/generics/6487370/T6487370.java
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Thu Oct 23 17:59:43 2008 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Thu Oct 23 18:00:05 2008 +0100
@@ -650,8 +650,9 @@
                 // both abstract or both concrete
                 if (!m1Abstract && !m2Abstract)
                     return new AmbiguityError(m1, m2);
-                // check for same erasure
-                if (!types.isSameType(m1.erasure(types), m2.erasure(types)))
+                // check that both signatures have the same erasure
+                if (!types.isSameTypes(m1.erasure(types).getParameterTypes(),
+                                       m2.erasure(types).getParameterTypes()))
                     return new AmbiguityError(m1, m2);
                 // both abstract, neither overridden; merge throws clause and result type
                 Symbol result;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6487370/T6487370.java	Thu Oct 23 18:00:05 2008 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6487370
+ * @author Maurizio Cimadamore
+ * @summary javac incorrectly gives ambiguity warning with override-equivalent abstract inherited methods
+ */
+
+public class T6487370 {
+
+    interface I1 {
+        String m(Number n);
+    }
+
+    interface I2 {
+        Object m(Number n);
+    }
+
+    static abstract class X implements I1, I2 {
+        String test() {
+            return m(0.0f);
+        }
+    }
+
+    static class W extends X {
+        public String m(Number n) {
+            return "Hello!";
+        }
+    }
+
+    public static void main(String args[]) {
+        System.out.println(new W().test());
+    }
+}