diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt index 537e52c792a..81b68fdcd39 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt @@ -104,7 +104,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen } val resolvedCall = getResolvedCall(ktLeft) ?: TODO("no resolved call for LHS") - val descriptor = resolvedCall.candidateDescriptor + val descriptor = resolvedCall.resultingDescriptor return when (descriptor) { is SyntheticFieldDescriptor -> { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt index a48837440ee..a77d9ab0d14 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/transformations/InsertImplicitCasts.kt @@ -188,6 +188,8 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi if (expectedType == null) return this if (expectedType.isError) return this + val notNullableExpectedType = expectedType.makeNotNullable() + val valueType = this.type return when { @@ -196,17 +198,17 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi valueType.isNullabilityFlexible() && valueType.containsNull() && !expectedType.containsNull() -> { val nonNullValueType = valueType.upperIfFlexible().makeNotNullable() IrTypeOperatorCallImpl( - this.startOffset, this.endOffset, nonNullValueType, + startOffset, endOffset, nonNullValueType, IrTypeOperator.IMPLICIT_NOTNULL, nonNullValueType, this ).cast(expectedType) } KotlinTypeChecker.DEFAULT.isSubtypeOf(valueType.makeNotNullable(), expectedType) -> this - KotlinBuiltIns.isInt(valueType) -> - IrTypeOperatorCallImpl(this.startOffset, this.endOffset, expectedType, - IrTypeOperator.IMPLICIT_INTEGER_COERCION, expectedType.makeNotNullable(), this) + KotlinBuiltIns.isInt(valueType) && notNullableExpectedType.isBuiltInIntegerType() -> + IrTypeOperatorCallImpl(startOffset, endOffset, expectedType, + IrTypeOperator.IMPLICIT_INTEGER_COERCION, notNullableExpectedType, this) else -> - IrTypeOperatorCallImpl(this.startOffset, this.endOffset, expectedType, + IrTypeOperatorCallImpl(startOffset, endOffset, expectedType, IrTypeOperator.IMPLICIT_CAST, expectedType, this) } } @@ -220,5 +222,11 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi IrTypeOperatorCallImpl(startOffset, endOffset, builtIns.unitType, IrTypeOperator.IMPLICIT_COERCION_TO_UNIT, builtIns.unitType, this) } + + private fun KotlinType.isBuiltInIntegerType(): Boolean = + KotlinBuiltIns.isByte(this) || + KotlinBuiltIns.isShort(this) || + KotlinBuiltIns.isInt(this) || + KotlinBuiltIns.isLong(this) } diff --git a/compiler/testData/ir/irText/regressions/integerCoercionToT.kt b/compiler/testData/ir/irText/regressions/integerCoercionToT.kt new file mode 100644 index 00000000000..5603b4dfb3a --- /dev/null +++ b/compiler/testData/ir/irText/regressions/integerCoercionToT.kt @@ -0,0 +1,16 @@ +interface CPointed + +inline fun CPointed.reinterpret(): T = TODO() + +class CInt32VarX : CPointed +typealias CInt32Var = CInt32VarX + +var CInt32VarX.value: T_INT + get() = TODO() + set(value) {} + +class IdType(val value: Int) : CPointed + +fun foo(value: IdType, cv: CInt32Var) { + cv.value = value.value +} diff --git a/compiler/testData/ir/irText/regressions/integerCoercionToT.txt b/compiler/testData/ir/irText/regressions/integerCoercionToT.txt new file mode 100644 index 00000000000..dc4215cfe25 --- /dev/null +++ b/compiler/testData/ir/irText/regressions/integerCoercionToT.txt @@ -0,0 +1,39 @@ +FILE /integerCoercionToT.kt + CLASS INTERFACE CPointed + FUN public inline fun CPointed.reinterpret(): T + BLOCK_BODY + RETURN type=kotlin.Nothing from='reinterpret() on CPointed: T' + CALL 'TODO(): Nothing' type=kotlin.Nothing origin=null + CLASS CLASS CInt32VarX + CONSTRUCTOR public constructor CInt32VarX() + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='CInt32VarX' + TYPEALIAS typealias CInt32Var = CInt32VarX type=CInt32VarX + PROPERTY public var CInt32VarX.value: T_INT + FUN public fun CInt32VarX.(): T_INT + BLOCK_BODY + RETURN type=kotlin.Nothing from='() on CInt32VarX: T_INT' + CALL 'TODO(): Nothing' type=kotlin.Nothing origin=null + FUN public fun CInt32VarX.(value: T_INT): kotlin.Unit + BLOCK_BODY + CLASS CLASS IdType + CONSTRUCTOR public constructor IdType(value: kotlin.Int) + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'constructor Any()' + INSTANCE_INITIALIZER_CALL classDescriptor='IdType' + PROPERTY public final val value: kotlin.Int + FIELD PROPERTY_BACKING_FIELD public final val value: kotlin.Int + EXPRESSION_BODY + GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR public final fun (): kotlin.Int + BLOCK_BODY + RETURN type=kotlin.Nothing from='(): Int' + GET_FIELD 'value: Int' type=kotlin.Int origin=null + receiver: GET_VAR '' type=IdType origin=null + FUN public fun foo(value: IdType, cv: CInt32Var /* = CInt32VarX */): kotlin.Unit + BLOCK_BODY + CALL '(Int) on CInt32VarX: Unit' type=kotlin.Unit origin=EQ + $receiver: GET_VAR 'value-parameter cv: CInt32Var /* = CInt32VarX */' type=CInt32Var /* = CInt32VarX */ origin=null + value: CALL '(): Int' type=kotlin.Int origin=GET_PROPERTY + $this: GET_VAR 'value-parameter value: IdType' type=IdType origin=null diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 36a6c965dc6..ae54cf1211b 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -847,6 +847,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/regressions/coercionInLoop.kt"); doTest(fileName); } + + @TestMetadata("integerCoercionToT.kt") + public void testIntegerCoercionToT() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/regressions/integerCoercionToT.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/ir/irText/singletons")