提交 d4501d40 编写于 作者: M mcimadamore

8189838: Stack overflow when computing upward projection of an intersection type with fbounds

Summary: Bad logic for detecting loop in type-variable upper bounds
Reviewed-by: vromero
上级 cff0ad46
...@@ -292,8 +292,8 @@ public class Types { ...@@ -292,8 +292,8 @@ public class Types {
@Override @Override
public Type visitTypeVar(TypeVar t, ProjectionKind pkind) { public Type visitTypeVar(TypeVar t, ProjectionKind pkind) {
if (vars.contains(t)) { if (vars.contains(t)) {
try { if (seen.add(t)) {
if (seen.add(t)) { try {
final Type bound; final Type bound;
switch (pkind) { switch (pkind) {
case UPWARDS: case UPWARDS:
...@@ -309,12 +309,13 @@ public class Types { ...@@ -309,12 +309,13 @@ public class Types {
return null; return null;
} }
return bound.map(this, pkind); return bound.map(this, pkind);
} else { } finally {
//cycle seen.remove(t);
return syms.objectType;
} }
} finally { } else {
seen.remove(t); //cycle
return pkind == ProjectionKind.UPWARDS ?
syms.objectType : syms.botType;
} }
} else { } else {
return t; return t;
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
/* /*
* @test * @test
* @bug 8177466 * @bug 8177466 8189838
* @summary Add compiler support for local variable type-inference * @summary Add compiler support for local variable type-inference
* @modules jdk.compiler/com.sun.source.tree * @modules jdk.compiler/com.sun.source.tree
* jdk.compiler/com.sun.source.util * jdk.compiler/com.sun.source.util
...@@ -50,6 +50,7 @@ class NonDenotableTest { ...@@ -50,6 +50,7 @@ class NonDenotableTest {
static final String LIST_EXT_COMP_UNB = "java.util.List<? extends java.lang.Comparable<?>>"; static final String LIST_EXT_COMP_UNB = "java.util.List<? extends java.lang.Comparable<?>>";
static final String LIST_SUP_COMP_UNB = "java.util.List<? super java.lang.Comparable<?>>"; static final String LIST_SUP_COMP_UNB = "java.util.List<? super java.lang.Comparable<?>>";
static final String INT_INTEGER_DOUBLE = "#INT(java.lang.Number,java.lang.Comparable<? extends java.lang.Number&java.lang.Comparable<?>>)"; static final String INT_INTEGER_DOUBLE = "#INT(java.lang.Number,java.lang.Comparable<? extends java.lang.Number&java.lang.Comparable<?>>)";
static final String SEL_INT_ENUM_SEL = "NonDenotableTest.Selector<? extends #INT(java.lang.Enum<?>,NonDenotableTest.Selector<?>)>";
void testExtends() { void testExtends() {
@InferredType(LIST_EXT) @InferredType(LIST_EXT)
...@@ -120,6 +121,14 @@ class NonDenotableTest { ...@@ -120,6 +121,14 @@ class NonDenotableTest {
for (@InferredType(INT_INTEGER_DOUBLE) var s2 : listOf(choose(1, 1L))) { break; } for (@InferredType(INT_INTEGER_DOUBLE) var s2 : listOf(choose(1, 1L))) { break; }
} }
void testIntersection(Selector<?> s) {
@InferredType(SEL_INT_ENUM_SEL)
var c = s;
for (@InferredType(SEL_INT_ENUM_SEL) var s2 = s ; ;) { break; }
for (@InferredType(SEL_INT_ENUM_SEL) var s2 : arrayOf(s)) { break; }
for (@InferredType(SEL_INT_ENUM_SEL) var s2 : listOf(s)) { break; }
}
List<? extends String> extString() { return null; } List<? extends String> extString() { return null; }
List<? super String> supString() { return null; } List<? super String> supString() { return null; }
List<?> unbString() { return null; } List<?> unbString() { return null; }
...@@ -145,4 +154,6 @@ class NonDenotableTest { ...@@ -145,4 +154,6 @@ class NonDenotableTest {
<Z> Z[] arrayOf(Z z) { return null; } <Z> Z[] arrayOf(Z z) { return null; }
<Z> Z choose(Z z1, Z z2) { return z1; } <Z> Z choose(Z z1, Z z2) { return z1; }
interface Selector<E extends Enum<E> & Selector<E>> {}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册