# HG changeset patch # User vromero # Date 1365593462 -3600 # Node ID a4be2c2fe0a18f23c5a3bffc4197e9f43df3efd1 # Parent eb134c8e931dfcc695be023f2390aca1f8fba7f7 8011432: javac, compiler regression iterable + captured type Reviewed-by: mcimadamore diff -r eb134c8e931d -r a4be2c2fe0a1 src/share/classes/com/sun/tools/javac/comp/Lower.java --- a/src/share/classes/com/sun/tools/javac/comp/Lower.java Tue Apr 09 14:18:22 2013 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Lower.java Wed Apr 10 12:31:02 2013 +0100 @@ -48,6 +48,7 @@ import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; +import javax.lang.model.type.TypeKind; /** This pass translates away some syntactic sugar: inner classes, * class literals, assertions, foreach loops, etc. @@ -3400,8 +3401,11 @@ if (iterableType.getTypeArguments().nonEmpty()) iteratorTarget = types.erasure(iterableType.getTypeArguments().head); Type eType = tree.expr.type; + while (eType.hasTag(TYPEVAR)) { + eType = eType.getUpperBound(); + } tree.expr.type = types.erasure(eType); - if (eType.hasTag(TYPEVAR) && eType.getUpperBound().isCompound()) + if (eType.isCompound()) tree.expr = make.TypeCast(types.erasure(iterableType), tree.expr); Symbol iterator = lookupMethod(tree.expr.pos(), names.iterator, diff -r eb134c8e931d -r a4be2c2fe0a1 test/tools/javac/T5053846/MethodRefDupInConstantPoolTest.java --- a/test/tools/javac/T5053846/MethodRefDupInConstantPoolTest.java Tue Apr 09 14:18:22 2013 -0700 +++ b/test/tools/javac/T5053846/MethodRefDupInConstantPoolTest.java Wed Apr 10 12:31:02 2013 +0100 @@ -23,8 +23,9 @@ /* * @test - * @bug 5053846 + * @bug 5053846 8011432 * @summary javac: MethodRef entries are duplicated in the constant pool + * @summary javac, compiler regression iterable + captured type */ import java.io.PrintWriter; @@ -43,9 +44,13 @@ void run() { check("-v", Paths.get(System.getProperty("test.classes"), - "TestHelper1.class").toString()); + this.getClass().getSimpleName() + "$TestHelper1.class").toString()); + check("-v", Paths.get(System.getProperty("test.classes"), + this.getClass().getSimpleName() + "$TestHelper2.class").toString()); check("-v", Paths.get(System.getProperty("test.classes"), - "TestHelper2.class").toString()); + this.getClass().getSimpleName() + "$TestHelper3.class").toString()); + check("-v", Paths.get(System.getProperty("test.classes"), + this.getClass().getSimpleName() + "$TestHelper4.class").toString()); } void check(String... params) { @@ -68,24 +73,38 @@ int end = out.indexOf("{"); return out.substring(start, end); } -} -class TestHelper1 { - void m() { - Vector v = new Vector(); - Iterator iter = v.iterator(); - while (iter.hasNext()) { - Object o = iter.next(); - Object o2 = o; - } - for (Object o: v) { - Object o2 = o; + class TestHelper1 { + void m() { + Vector v = new Vector(); + Iterator iter = v.iterator(); + while (iter.hasNext()) { + Object o = iter.next(); + Object o2 = o; + } + for (Object o: v) { + Object o2 = o; + } } } -} + + class TestHelper2> { + void test(X x) { + for (String s : x) { } + } + } + + interface Data extends Iterable {} -class TestHelper2> { - void test(X x) { - for (String s : x) { } + class TestHelper3> { + void test(X x) { + for (Data s : x) { } + } + } + + class TestHelper4 { + void test(Iterable t) { + for(Object a: t.iterator().next()); + } } }