Mercurial > hg > jdk9-shenandoah > langtools
changeset 23:d032d5090fd5
5009937: hiding versus generics versus binary compatibility
Summary: missing implementation of JLS 8.4.8.3 (different arguments with same erasure not always triggering a compiler error)
Reviewed-by: jjg
author | mcimadamore |
---|---|
date | Wed, 09 Apr 2008 13:41:45 +0100 |
parents | 961ae2608114 |
children | 57ba4f70f0d8 |
files | src/share/classes/com/sun/tools/javac/comp/Check.java test/tools/javac/generics/5009937/T5009937.java test/tools/javac/generics/5009937/T5009937.out test/tools/javac/generics/InheritanceConflict.java test/tools/javac/generics/InheritanceConflict2.java |
diffstat | 5 files changed, 64 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/comp/Check.java Wed Apr 09 13:19:01 2008 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Wed Apr 09 13:41:45 2008 +0100 @@ -1247,7 +1247,7 @@ for (Type t2 = sup; t2.tag == CLASS; t2 = types.supertype(t2)) { - for (Scope.Entry e2 = t1.tsym.members().lookup(s1.name); + for (Scope.Entry e2 = t2.tsym.members().lookup(s1.name); e2.scope != null; e2 = e2.next()) { Symbol s2 = e2.sym; @@ -1394,6 +1394,16 @@ while (e.scope != null) { if (m.overrides(e.sym, origin, types, false)) checkOverride(tree, m, (MethodSymbol)e.sym, origin); + else if (e.sym.isInheritedIn(origin, types) && !m.isConstructor()) { + Type er1 = m.erasure(types); + Type er2 = e.sym.erasure(types); + if (types.isSameType(er1,er2)) { + log.error(TreeInfo.diagnosticPositionFor(m, tree), + "name.clash.same.erasure.no.override", + m, m.location(), + e.sym, e.sym.location()); + } + } e = e.next(); } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/5009937/T5009937.java Wed Apr 09 13:41:45 2008 +0100 @@ -0,0 +1,41 @@ +/* + * 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 5009937 + * @summary hiding versus generics versus binary compatibility + * @author Maurizio Cimadamore + * + * @compile/fail/ref=T5009937.out -XDstdout -XDrawDiagnostics T5009937.java + */ + +public class T5009937<X> { + static class A { + static void m(T5009937<String> l) {} + } + + static class B extends A { + static void m(T5009937<Integer> l) {} + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/5009937/T5009937.out Wed Apr 09 13:41:45 2008 +0100 @@ -0,0 +1,2 @@ +T5009937.java:39:21: compiler.err.name.clash.same.erasure.no.override: m(T5009937<java.lang.Integer>), T5009937.B, m(T5009937<java.lang.String>), T5009937.A +1 error
--- a/test/tools/javac/generics/InheritanceConflict.java Wed Apr 09 13:19:01 2008 +0100 +++ b/test/tools/javac/generics/InheritanceConflict.java Wed Apr 09 13:41:45 2008 +0100 @@ -25,7 +25,7 @@ * @test * @bug 4984158 * @summary two inherited methods with same signature - * @author gafter + * @author gafter, Maurizio Cimadamore * * @compile/fail -source 1.5 InheritanceConflict.java */ @@ -34,8 +34,11 @@ class A<T> { void f(String s) {} +} + +class B<T> extends A<T> { void f(T t) {} } -class B extends A<String> { +class C extends B<String> { }
--- a/test/tools/javac/generics/InheritanceConflict2.java Wed Apr 09 13:19:01 2008 +0100 +++ b/test/tools/javac/generics/InheritanceConflict2.java Wed Apr 09 13:41:45 2008 +0100 @@ -25,7 +25,7 @@ * @test * @bug 4984158 * @summary two inherited methods with same signature - * @author gafter + * @author gafter, Maurizio Cimadamore * * @compile -source 1.5 InheritanceConflict2.java */ @@ -34,9 +34,12 @@ class A<T> { void f(String s) {} +} + +class B<T> extends A<T> { void f(T t) {} } -class B extends A<String> { +class C extends B<String> { void f(String s) {} }