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");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt48590.kt")
|
||||
public void testKt48590() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/kt48590.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lambdaInstanceOf.kt")
|
||||
public void testLambdaInstanceOf() throws Exception {
|
||||
|
||||
+8
-3
@@ -307,13 +307,18 @@ class ConstraintInjector(
|
||||
override fun addEqualityConstraint(typeVariable: TypeConstructorMarker, type: KotlinTypeMarker) =
|
||||
addConstraint(typeVariable, type, EQUALITY, false)
|
||||
|
||||
private fun isCapturedTypeFromSubtyping(type: KotlinTypeMarker) =
|
||||
when ((type as? CapturedTypeMarker)?.captureStatus()) {
|
||||
null, CaptureStatus.FROM_EXPRESSION -> false
|
||||
private fun isCapturedTypeFromSubtyping(type: KotlinTypeMarker): Boolean {
|
||||
val capturedType = type as? CapturedTypeMarker ?: return false
|
||||
|
||||
if (capturedType.isOldCapturedType()) return false
|
||||
|
||||
return when (capturedType.captureStatus()) {
|
||||
CaptureStatus.FROM_EXPRESSION -> false
|
||||
CaptureStatus.FOR_SUBTYPING -> true
|
||||
CaptureStatus.FOR_INCORPORATION ->
|
||||
error("Captured type for incorporation shouldn't escape from incorporation: $type\n" + renderBaseConstraint())
|
||||
}
|
||||
}
|
||||
|
||||
private fun addConstraint(
|
||||
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");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt48590.kt")
|
||||
public void testKt48590() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/kt48590.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("lambdaInstanceOf.kt")
|
||||
public void testLambdaInstanceOf() throws Exception {
|
||||
|
||||
+6
@@ -23558,6 +23558,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
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
|
||||
@TestMetadata("lambdaInstanceOf.kt")
|
||||
public void testLambdaInstanceOf() throws Exception {
|
||||
|
||||
+5
@@ -19655,6 +19655,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
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")
|
||||
public void testLambdaInstanceOf() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/lambdaInstanceOf.kt");
|
||||
|
||||
Reference in New Issue
Block a user