# HG changeset patch # User mcimadamore # Date 1207133063 -3600 # Node ID d51f30ce6796d88a24b4897900f8a2d8fd8c7437 # Parent 44df0e9643b496cd1b5538d383bd43b2ff54be71 6531090: Cannot access methods/fields of a captured type belonging to an intersection type Summary: fixed lookup of field/methods on intersection types Reviewed-by: jjg diff -r 44df0e9643b4 -r d51f30ce6796 langtools/src/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Wed Apr 02 11:38:16 2008 +0100 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Wed Apr 02 11:44:23 2008 +0100 @@ -1298,7 +1298,7 @@ return t; Type st = supertype(t); - if (st.tag == CLASS || st.tag == ERROR) { + if (st.tag == CLASS || st.tag == TYPEVAR || st.tag == ERROR) { Type x = asSuper(st, sym); if (x != null) return x; @@ -1320,7 +1320,10 @@ @Override public Type visitTypeVar(TypeVar t, Symbol sym) { - return asSuper(t.bound, sym); + if (t.tsym == sym) + return t; + else + return asSuper(t.bound, sym); } @Override diff -r 44df0e9643b4 -r d51f30ce6796 langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Apr 02 11:38:16 2008 +0100 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Apr 02 11:44:23 2008 +0100 @@ -407,6 +407,8 @@ Type site, Name name, TypeSymbol c) { + while (c.type.tag == TYPEVAR) + c = c.type.getUpperBound().tsym; Symbol bestSoFar = varNotFound; Symbol sym; Scope.Entry e = c.members().lookup(name); @@ -418,7 +420,7 @@ e = e.next(); } Type st = types.supertype(c.type); - if (st != null && st.tag == CLASS) { + if (st != null && (st.tag == CLASS || st.tag == TYPEVAR)) { sym = findField(env, site, name, st.tsym); if (sym.kind < bestSoFar.kind) bestSoFar = sym; } @@ -733,7 +735,9 @@ boolean allowBoxing, boolean useVarargs, boolean operator) { - for (Type ct = intype; ct.tag == CLASS; ct = types.supertype(ct)) { + for (Type ct = intype; ct.tag == CLASS || ct.tag == TYPEVAR; ct = types.supertype(ct)) { + while (ct.tag == TYPEVAR) + ct = ct.getUpperBound(); ClassSymbol c = (ClassSymbol)ct.tsym; if ((c.flags() & (ABSTRACT | INTERFACE)) == 0) abstractok = false; diff -r 44df0e9643b4 -r d51f30ce6796 langtools/test/tools/javac/generics/6531090/T6531090a.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6531090/T6531090a.java Wed Apr 02 11:44:23 2008 +0100 @@ -0,0 +1,59 @@ +/* + * 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 6531090 + * + * @summary Cannot access methods/fields of a captured type belonging to an intersection type + * @author Maurizio Cimadamore + * + */ +public class T6531090a { + + static class E {} + + static class F extends E implements I1 {} + + static interface I {} + + static interface I1 {} + + static class G extends F implements I {} + + static class C { + T field; + } + + public static void main(String... args) { + test(new C()); + } + + static void test(C arg) { + F vf = arg.field; + I vi = arg.field; + I1 vi1 = arg.field; + E ve = arg.field; + W vt = arg.field; + } +} diff -r 44df0e9643b4 -r d51f30ce6796 langtools/test/tools/javac/generics/6531090/T6531090b.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/6531090/T6531090b.java Wed Apr 02 11:44:23 2008 +0100 @@ -0,0 +1,82 @@ +/* + * 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 6531090 + * + * @summary Cannot access methods/fields of a captured type belonging to an intersection type + * @author Maurizio Cimadamore + * + */ +public class T6531090b { + + static class A { + public void a() {} + public A a; + } + static class B extends A { + public void b(){} + public B b; + } + static interface I{ + void i(); + } + static interface I1{ + void i1(); + } + static class E extends B implements I, I1{ + public void i() {} + public void i1() {} + } + static class C{ + T t; + W w; + C(W w, T t) { + this.w = w; + this.t = t; + } + } + + public static void main(String... args) { + C c = new C(new E(), new E()); + testMemberMethods(c); + testMemberFields(c); + } + + static void testMemberMethods(C arg) { + arg.t.a(); + arg.t.b(); + arg.t.i1(); + arg.w.a(); + arg.w.b(); + arg.w.i1(); + } + + static void testMemberFields(C arg) { + A ta = arg.t.a; + B tb = arg.t.b; + A wa = arg.w.a; + B wb = arg.w.b; + } +}