Take into account possible passed old captured type in isCapturedTypeFromSubtyping check
^KT-48590 Fixed
This commit is contained in:
+6
@@ -23558,6 +23558,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt48590.kt")
|
||||||
|
public void testKt48590() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/javaInterop/kt48590.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("lambdaInstanceOf.kt")
|
@TestMetadata("lambdaInstanceOf.kt")
|
||||||
public void testLambdaInstanceOf() throws Exception {
|
public void testLambdaInstanceOf() throws Exception {
|
||||||
|
|||||||
+8
-3
@@ -307,13 +307,18 @@ class ConstraintInjector(
|
|||||||
override fun addEqualityConstraint(typeVariable: TypeConstructorMarker, type: KotlinTypeMarker) =
|
override fun addEqualityConstraint(typeVariable: TypeConstructorMarker, type: KotlinTypeMarker) =
|
||||||
addConstraint(typeVariable, type, EQUALITY, false)
|
addConstraint(typeVariable, type, EQUALITY, false)
|
||||||
|
|
||||||
private fun isCapturedTypeFromSubtyping(type: KotlinTypeMarker) =
|
private fun isCapturedTypeFromSubtyping(type: KotlinTypeMarker): Boolean {
|
||||||
when ((type as? CapturedTypeMarker)?.captureStatus()) {
|
val capturedType = type as? CapturedTypeMarker ?: return false
|
||||||
null, CaptureStatus.FROM_EXPRESSION -> false
|
|
||||||
|
if (capturedType.isOldCapturedType()) return false
|
||||||
|
|
||||||
|
return when (capturedType.captureStatus()) {
|
||||||
|
CaptureStatus.FROM_EXPRESSION -> false
|
||||||
CaptureStatus.FOR_SUBTYPING -> true
|
CaptureStatus.FOR_SUBTYPING -> true
|
||||||
CaptureStatus.FOR_INCORPORATION ->
|
CaptureStatus.FOR_INCORPORATION ->
|
||||||
error("Captured type for incorporation shouldn't escape from incorporation: $type\n" + renderBaseConstraint())
|
error("Captured type for incorporation shouldn't escape from incorporation: $type\n" + renderBaseConstraint())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun addConstraint(
|
private fun addConstraint(
|
||||||
typeVariableConstructor: TypeConstructorMarker,
|
typeVariableConstructor: TypeConstructorMarker,
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
|
// FILE: Foo.java
|
||||||
|
public interface Foo<R> {
|
||||||
|
<E> String into(Class<? extends E> type);
|
||||||
|
<H extends Bar<R>> String into(H handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: Bar.java
|
||||||
|
public class Bar<K> {}
|
||||||
|
|
||||||
|
// FILE: main.kt
|
||||||
|
inline fun <reified E: Any> Foo<*>.into(): String = into(E::class.java)
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return (object : Foo<Any> {
|
||||||
|
override fun <E> into(type: Class<out E>?): String = "OK"
|
||||||
|
override fun <H : Bar<Any>?> into(handler: H): String = "NOK"
|
||||||
|
}).into<Int>()
|
||||||
|
}
|
||||||
+6
@@ -23420,6 +23420,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt48590.kt")
|
||||||
|
public void testKt48590() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/javaInterop/kt48590.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("lambdaInstanceOf.kt")
|
@TestMetadata("lambdaInstanceOf.kt")
|
||||||
public void testLambdaInstanceOf() throws Exception {
|
public void testLambdaInstanceOf() throws Exception {
|
||||||
|
|||||||
+6
@@ -23558,6 +23558,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt48590.kt")
|
||||||
|
public void testKt48590() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/javaInterop/kt48590.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("lambdaInstanceOf.kt")
|
@TestMetadata("lambdaInstanceOf.kt")
|
||||||
public void testLambdaInstanceOf() throws Exception {
|
public void testLambdaInstanceOf() throws Exception {
|
||||||
|
|||||||
+5
@@ -19655,6 +19655,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
runTest("compiler/testData/codegen/box/javaInterop/kt43217.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt48590.kt")
|
||||||
|
public void testKt48590() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/javaInterop/kt48590.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("lambdaInstanceOf.kt")
|
@TestMetadata("lambdaInstanceOf.kt")
|
||||||
public void testLambdaInstanceOf() throws Exception {
|
public void testLambdaInstanceOf() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/javaInterop/lambdaInstanceOf.kt");
|
runTest("compiler/testData/codegen/box/javaInterop/lambdaInstanceOf.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user