diff --git a/compiler/testData/codegen/box/builderInference/issues/kt63840a.kt b/compiler/testData/codegen/box/builderInference/issues/kt63840a.kt new file mode 100644 index 00000000000..75e45569fdf --- /dev/null +++ b/compiler/testData/codegen/box/builderInference/issues/kt63840a.kt @@ -0,0 +1,36 @@ +// ISSUE: KT-63840 +// WITH_STDLIB + +// IGNORE_LIGHT_ANALYSIS +// IGNORE_BACKEND_K1: ANY +// REASON: red code (see corresponding diagnostic test) + +// IGNORE_BACKEND_K2: JVM_IR, WASM +// REASON: run-time failure (java.lang.ArrayStoreException: TargetType @ Kt63840aKt$box$1.invoke) + +fun box(): String { + build { + select( + replaceTypeVariable(TargetType()), + DifferentType() + ) + } + return "OK" +} + + + + +fun select(vararg values: T): T = values.first() + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = TargetType() as TV +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/codegen/box/builderInference/issues/kt63840b.kt b/compiler/testData/codegen/box/builderInference/issues/kt63840b.kt new file mode 100644 index 00000000000..729b7fbf269 --- /dev/null +++ b/compiler/testData/codegen/box/builderInference/issues/kt63840b.kt @@ -0,0 +1,33 @@ +// ISSUE: KT-63840 + +// IGNORE_LIGHT_ANALYSIS +// IGNORE_BACKEND_K1: ANY +// REASON: red code (see corresponding diagnostic test) + +// IGNORE_BACKEND_K2: JVM_IR +// REASON: run-time failure (java.lang.ClassCastException: TargetType cannot be cast to DifferentType @ Kt63840bKt$box$1.invoke) + +fun box(): String { + build { + if (true) + replaceTypeVariable(TargetType()) + else + DifferentType() + } + return "OK" +} + + + + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = TargetType() as TV +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/codegen/box/builderInference/issues/kt63840c.kt b/compiler/testData/codegen/box/builderInference/issues/kt63840c.kt new file mode 100644 index 00000000000..ddac18b31a6 --- /dev/null +++ b/compiler/testData/codegen/box/builderInference/issues/kt63840c.kt @@ -0,0 +1,33 @@ +// ISSUE: KT-63840 + +// IGNORE_LIGHT_ANALYSIS +// IGNORE_BACKEND_K1: ANY +// REASON: red code (see corresponding diagnostic test) + +// IGNORE_BACKEND_K2: JVM_IR +// REASON: run-time failure (java.lang.ClassCastException: TargetType cannot be cast to DifferentType @ Kt63840cKt$box$1.invoke) + +fun box(): String { + build { + when { + true -> replaceTypeVariable(TargetType()) + else -> DifferentType() + } + } + return "OK" +} + + + + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = TargetType() as TV +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63840a.fir.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840a.fir.kt new file mode 100644 index 00000000000..79283de21f9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840a.fir.kt @@ -0,0 +1,32 @@ +// ISSUE: KT-63840 +// CHECK_TYPE_WITH_EXACT +// WITH_STDLIB + +fun test() { + val buildee = build { + select( + replaceTypeVariable(TargetType()), + DifferentType() + ) + } + // exact type equality check — turns unexpected compile-time behavior into red code + // considered to be non-user-reproducible code for the purposes of these tests + checkExactType>(buildee) +} + + + + +fun select(vararg values: T): T = values.first() + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63840a.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840a.kt new file mode 100644 index 00000000000..65d5f8df265 --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840a.kt @@ -0,0 +1,32 @@ +// ISSUE: KT-63840 +// CHECK_TYPE_WITH_EXACT +// WITH_STDLIB + +fun test() { + val buildee = build { + select( + replaceTypeVariable(TargetType()), + DifferentType() + ) + } + // exact type equality check — turns unexpected compile-time behavior into red code + // considered to be non-user-reproducible code for the purposes of these tests + checkExactType>(buildee) +} + + + + +fun select(vararg values: T): T = values.first() + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63840b.fir.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840b.fir.kt new file mode 100644 index 00000000000..b5641d28760 --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840b.fir.kt @@ -0,0 +1,29 @@ +// ISSUE: KT-63840 +// CHECK_TYPE_WITH_EXACT + +fun test() { + val buildee = build { + if (true) + replaceTypeVariable(TargetType()) + else + DifferentType() + } + // exact type equality check — turns unexpected compile-time behavior into red code + // considered to be non-user-reproducible code for the purposes of these tests + checkExactType>(buildee) +} + + + + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63840b.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840b.kt new file mode 100644 index 00000000000..7ca9c7d673a --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840b.kt @@ -0,0 +1,29 @@ +// ISSUE: KT-63840 +// CHECK_TYPE_WITH_EXACT + +fun test() { + val buildee = build { + if (true) + replaceTypeVariable(TargetType()) + else + DifferentType() + } + // exact type equality check — turns unexpected compile-time behavior into red code + // considered to be non-user-reproducible code for the purposes of these tests + checkExactType>(buildee) +} + + + + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63840c.fir.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840c.fir.kt new file mode 100644 index 00000000000..e254c838b96 --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840c.fir.kt @@ -0,0 +1,29 @@ +// ISSUE: KT-63840 +// CHECK_TYPE_WITH_EXACT + +fun test() { + val buildee = build { + when { + true -> replaceTypeVariable(TargetType()) + else -> DifferentType() + } + } + // exact type equality check — turns unexpected compile-time behavior into red code + // considered to be non-user-reproducible code for the purposes of these tests + checkExactType>(buildee) +} + + + + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63840c.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840c.kt new file mode 100644 index 00000000000..386d5f234b2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63840c.kt @@ -0,0 +1,29 @@ +// ISSUE: KT-63840 +// CHECK_TYPE_WITH_EXACT + +fun test() { + val buildee = build { + when { + true -> replaceTypeVariable(TargetType()) + else -> DifferentType() + } + } + // exact type equality check — turns unexpected compile-time behavior into red code + // considered to be non-user-reproducible code for the purposes of these tests + checkExactType>(buildee) +} + + + + +class TargetType +class DifferentType + +class Buildee { + fun replaceTypeVariable(value: TV): TV { val temp = storage; storage = value; return temp } + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +}