8011432: javac, compiler regression iterable + captured type

Reviewed-by: mcimadamore
This commit is contained in:
Vicente Romero 2013-04-10 12:31:02 +01:00
parent b82442a565
commit cde5be4904
2 changed files with 42 additions and 19 deletions

View file

@ -48,6 +48,7 @@ import static com.sun.tools.javac.code.Kinds.*;
import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.jvm.ByteCodes.*;
import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.*;
import javax.lang.model.type.TypeKind;
/** This pass translates away some syntactic sugar: inner classes, /** This pass translates away some syntactic sugar: inner classes,
* class literals, assertions, foreach loops, etc. * class literals, assertions, foreach loops, etc.
@ -3400,8 +3401,11 @@ public class Lower extends TreeTranslator {
if (iterableType.getTypeArguments().nonEmpty()) if (iterableType.getTypeArguments().nonEmpty())
iteratorTarget = types.erasure(iterableType.getTypeArguments().head); iteratorTarget = types.erasure(iterableType.getTypeArguments().head);
Type eType = tree.expr.type; Type eType = tree.expr.type;
while (eType.hasTag(TYPEVAR)) {
eType = eType.getUpperBound();
}
tree.expr.type = types.erasure(eType); 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); tree.expr = make.TypeCast(types.erasure(iterableType), tree.expr);
Symbol iterator = lookupMethod(tree.expr.pos(), Symbol iterator = lookupMethod(tree.expr.pos(),
names.iterator, names.iterator,

View file

@ -23,8 +23,9 @@
/* /*
* @test * @test
* @bug 5053846 * @bug 5053846 8011432
* @summary javac: MethodRef entries are duplicated in the constant pool * @summary javac: MethodRef entries are duplicated in the constant pool
* @summary javac, compiler regression iterable + captured type
*/ */
import java.io.PrintWriter; import java.io.PrintWriter;
@ -43,9 +44,13 @@ public class MethodRefDupInConstantPoolTest {
void run() { void run() {
check("-v", Paths.get(System.getProperty("test.classes"), 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"), check("-v", Paths.get(System.getProperty("test.classes"),
"TestHelper2.class").toString()); this.getClass().getSimpleName() + "$TestHelper2.class").toString());
check("-v", Paths.get(System.getProperty("test.classes"),
this.getClass().getSimpleName() + "$TestHelper3.class").toString());
check("-v", Paths.get(System.getProperty("test.classes"),
this.getClass().getSimpleName() + "$TestHelper4.class").toString());
} }
void check(String... params) { void check(String... params) {
@ -68,7 +73,6 @@ public class MethodRefDupInConstantPoolTest {
int end = out.indexOf("{"); int end = out.indexOf("{");
return out.substring(start, end); return out.substring(start, end);
} }
}
class TestHelper1 { class TestHelper1 {
void m() { void m() {
@ -89,3 +93,18 @@ class TestHelper2<X extends Number & Iterable<String>> {
for (String s : x) { } for (String s : x) { }
} }
} }
interface Data extends Iterable<String> {}
class TestHelper3<X extends Number & Iterable<? extends Data>> {
void test(X x) {
for (Data s : x) { }
}
}
class TestHelper4 {
void test(Iterable<? extends Data> t) {
for(Object a: t.iterator().next());
}
}
}