mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
8011432: javac, compiler regression iterable + captured type
Reviewed-by: mcimadamore
This commit is contained in:
parent
b82442a565
commit
cde5be4904
2 changed files with 42 additions and 19 deletions
|
@ -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,
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue