diff --git a/compiler/testData/codegen/box/builderInference/issues/kt43710.kt b/compiler/testData/codegen/box/builderInference/issues/kt43710.kt new file mode 100644 index 00000000000..fe66a2f9102 --- /dev/null +++ b/compiler/testData/codegen/box/builderInference/issues/kt43710.kt @@ -0,0 +1,33 @@ +// ISSUE: KT-43710 + +// IGNORE_LIGHT_ANALYSIS +// IGNORE_BACKEND: ANY +// REASON: red code (see corresponding diagnostic test) + +fun box(): String { + build { + setTypeVariable(TargetType()) + letForTypeVariable { it.extensionProduceConcreteType() } + } + return "OK" +} + + + + +class ConcreteType +class TargetType +class DifferentType + +fun TargetType.extensionProduceConcreteType(): ConcreteType = ConcreteType() +fun DifferentType.extensionProduceConcreteType(): ConcreteType = ConcreteType() + +class Buildee { + fun setTypeVariable(value: TV) { storage = value } + fun letForTypeVariable(action: (TV) -> ConcreteType): ConcreteType = storage.let(action) + 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/kt43710.fir.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt43710.fir.kt new file mode 100644 index 00000000000..901b632759a --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt43710.fir.kt @@ -0,0 +1,32 @@ +// ISSUE: KT-43710 +// CHECK_TYPE_WITH_EXACT + +fun test() { + val buildee = build { + setTypeVariable(TargetType()) + letForTypeVariable { it.extensionProduceConcreteType() } + } + // 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 ConcreteType +class TargetType +class DifferentType + +fun TargetType.extensionProduceConcreteType(): ConcreteType = ConcreteType() +fun DifferentType.extensionProduceConcreteType(): ConcreteType = ConcreteType() + +class Buildee { + fun setTypeVariable(value: TV) { storage = value } + fun letForTypeVariable(action: (TV) -> ConcreteType): ConcreteType = storage.let(action) + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt43710.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt43710.kt new file mode 100644 index 00000000000..54698b6a5d8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt43710.kt @@ -0,0 +1,32 @@ +// ISSUE: KT-43710 +// CHECK_TYPE_WITH_EXACT + +fun test() { + val buildee = build { + setTypeVariable(TargetType()) + letForTypeVariable { it.extensionProduceConcreteType() } + } + // 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 ConcreteType +class TargetType +class DifferentType + +fun TargetType.extensionProduceConcreteType(): ConcreteType = ConcreteType() +fun DifferentType.extensionProduceConcreteType(): ConcreteType = ConcreteType() + +class Buildee { + fun setTypeVariable(value: TV) { storage = value } + fun letForTypeVariable(action: (TV) -> ConcreteType): ConcreteType = storage.let(action) + private var storage: TV = null!! +} + +fun build(instructions: Buildee.() -> Unit): Buildee { + return Buildee().apply(instructions) +}