KT-3301 Inference with several supertypes fails

#KT-3301 fixed
This commit is contained in:
Svetlana Isakova
2013-01-30 20:29:30 +04:00
parent 3c82e80745
commit ba9c455ea1
3 changed files with 46 additions and 0 deletions
@@ -33,6 +33,12 @@ public class ConstraintsUtil {
public static Set<JetType> getValues(@Nullable TypeConstraints typeConstraints) {
Set<JetType> values = Sets.newLinkedHashSet();
if (typeConstraints != null && !typeConstraints.isEmpty()) {
if (typeConstraints.getExactBounds().size() == 1) {
if (verifyOneExactBound(typeConstraints)) {
JetType exactBound = typeConstraints.getExactBounds().iterator().next();
return Collections.singleton(exactBound);
}
}
values.addAll(typeConstraints.getExactBounds());
if (!typeConstraints.getLowerBounds().isEmpty()) {
JetType superTypeOfLowerBounds = CommonSupertypes.commonSupertype(typeConstraints.getLowerBounds());
@@ -63,6 +69,21 @@ public class ConstraintsUtil {
return values;
}
private static boolean verifyOneExactBound(@NotNull TypeConstraints typeConstraints) {
JetType exactBound = typeConstraints.getExactBounds().iterator().next();
for (JetType lowerBound : typeConstraints.getLowerBounds()) {
if (!JetTypeChecker.INSTANCE.isSubtypeOf(lowerBound, exactBound)) {
return false;
}
}
for (JetType upperBound : typeConstraints.getUpperBounds()) {
if (!JetTypeChecker.INSTANCE.isSubtypeOf(exactBound, upperBound)) {
return false;
}
}
return true;
}
@Nullable
public static JetType getValue(@Nullable TypeConstraints typeConstraints) {
//todo all checks
@@ -0,0 +1,20 @@
//KT-3301 Inference with several supertypes fails
package arrays
trait A
trait B
object CAB : A, B
object DAB : A, B
fun m(<!UNUSED_PARAMETER!>args<!> : Array<A>) {
}
fun test122() {
m(array(CAB, DAB)) // Wrong error here: Array<Any> is inferred while expected Array<A> is satisfied
}
//from library
fun array<T>(vararg <!UNUSED_PARAMETER!>t<!>: T): Array<T> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -2294,6 +2294,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt3174.kt");
}
@TestMetadata("kt3301.kt")
public void testKt3301() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt3301.kt");
}
@TestMetadata("kt702.kt")
public void testKt702() throws Exception {
doTest("compiler/testData/diagnostics/tests/inference/regressions/kt702.kt");