diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java index cbb840647c1..d575f5a172e 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java @@ -1072,6 +1072,11 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/expressions/kt36956.kt"); } + @TestMetadata("kt36963.kt") + public void testKt36963() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt36963.kt"); + } + @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { runTest("compiler/testData/ir/irText/expressions/lambdaInCAO.kt"); diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt index b70e05a7ea0..d30c0d5b6a9 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/OperatorExpressionGenerator.kt @@ -62,9 +62,8 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat fun generatePrefixExpression(expression: KtPrefixExpression): IrExpression { val ktOperator = expression.operationReference.getReferencedNameElementType() - val irOperator = getPrefixOperator(ktOperator) - return when (irOperator) { + return when (val irOperator = getPrefixOperator(ktOperator)) { null -> throw AssertionError("Unexpected prefix operator: $ktOperator") in INCREMENT_DECREMENT_OPERATORS -> @@ -78,9 +77,8 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat fun generatePostfixExpression(expression: KtPostfixExpression): IrExpression { val ktOperator = expression.operationReference.getReferencedNameElementType() - val irOperator = getPostfixOperator(ktOperator) - return when (irOperator) { + return when (val irOperator = getPostfixOperator(ktOperator)) { null -> throw AssertionError("Unexpected postfix operator: $ktOperator") in INCREMENT_DECREMENT_OPERATORS -> @@ -130,9 +128,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat return generateBinaryOperatorAsCall(expression, null) } - val irOperator = getInfixOperator(ktOperator) - - return when (irOperator) { + return when (val irOperator = getInfixOperator(ktOperator)) { null -> throw AssertionError("Unexpected infix operator: $ktOperator") IrStatementOrigin.EQ -> AssignmentGenerator(statementGenerator).generateAssignment(expression) in AUGMENTED_ASSIGNMENTS -> AssignmentGenerator(statementGenerator).generateAugmentedAssignment(expression, irOperator) @@ -319,7 +315,9 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat val comparisonInfo = getPrimitiveNumericComparisonInfo(expression) val comparisonType = comparisonInfo?.comparisonType - val eqeqSymbol = context.irBuiltIns.ieee754equalsFunByOperandType[kotlinTypeToIrType(comparisonType)?.classifierOrNull] ?: context.irBuiltIns.eqeqSymbol + val eqeqSymbol = + context.irBuiltIns.ieee754equalsFunByOperandType[kotlinTypeToIrType(comparisonType)?.classifierOrNull] + ?: context.irBuiltIns.eqeqSymbol val irEquals = primitiveOp2( expression.startOffsetSkippingComments, expression.endOffset, @@ -357,7 +355,8 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat if (comparisonInfo != null) { val comparisonType = comparisonInfo.comparisonType val eqeqSymbol = - context.irBuiltIns.ieee754equalsFunByOperandType[kotlinTypeToIrType(comparisonType)?.classifierOrNull] ?: context.irBuiltIns.eqeqSymbol + context.irBuiltIns.ieee754equalsFunByOperandType[kotlinTypeToIrType(comparisonType)?.classifierOrNull] ?: context.irBuiltIns + .eqeqSymbol primitiveOp2( startOffset, endOffset, eqeqSymbol, @@ -453,7 +452,10 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat val comparisonType = comparisonInfo.comparisonType primitiveOp2( startOffset, endOffset, - getComparisonOperatorSymbol(origin, kotlinTypeToIrType(comparisonType) ?: error("$comparisonType expected to be primitive")), + getComparisonOperatorSymbol( + origin, + kotlinTypeToIrType(comparisonType) ?: error("$comparisonType expected to be primitive") + ), context.irBuiltIns.booleanType, origin, ktLeft.generateAsPrimitiveNumericComparisonOperand(comparisonInfo.leftPrimitiveType, comparisonInfo.comparisonType), @@ -491,7 +493,7 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat }[primitiveNumericType.classifierOrFail]!! private fun generateExclExclOperator(expression: KtPostfixExpression, origin: IrStatementOrigin): IrExpression { - val ktArgument = expression.baseExpression!! + val ktArgument = KtPsiUtil.deparenthesize(expression.baseExpression!!)!! val irArgument = ktArgument.genExpr() val ktOperator = expression.operationReference diff --git a/compiler/testData/ir/irText/expressions/kt36963.fir.txt b/compiler/testData/ir/irText/expressions/kt36963.fir.txt new file mode 100644 index 00000000000..334ffd0f603 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt36963.fir.txt @@ -0,0 +1,9 @@ +FILE fqName: fileName:/kt36963.kt + FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.reflect.KFunction0 + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test (): kotlin.reflect.KFunction0 declared in ' + CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): T0 of kotlin.internal.ir.CHECK_NOT_NULL declared in kotlin.internal.ir' type=kotlin.reflect.KFunction0 origin=EXCLEXCL + : kotlin.reflect.KFunction0 + arg0: FUNCTION_REFERENCE 'public final fun foo (): kotlin.Unit declared in ' type=kotlin.reflect.KFunction0 origin=null reflectionTarget= diff --git a/compiler/testData/ir/irText/expressions/kt36963.kt b/compiler/testData/ir/irText/expressions/kt36963.kt new file mode 100644 index 00000000000..f2eb7497c47 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt36963.kt @@ -0,0 +1,3 @@ +fun foo() {} + +fun test() = (::foo)!! \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/kt36963.txt b/compiler/testData/ir/irText/expressions/kt36963.txt new file mode 100644 index 00000000000..2930185f6f7 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt36963.txt @@ -0,0 +1,9 @@ +FILE fqName: fileName:/kt36963.kt + FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + FUN name:test visibility:public modality:FINAL <> () returnType:IrErrorType + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test (): IrErrorType declared in ' + CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): T0 of kotlin.internal.ir.CHECK_NOT_NULL declared in kotlin.internal.ir' type=kotlin.reflect.KFunction0 origin=EXCLEXCL + : kotlin.reflect.KFunction0 + arg0: FUNCTION_REFERENCE 'public final fun foo (): kotlin.Unit declared in ' type=kotlin.reflect.KFunction0 origin=null reflectionTarget= diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index d7b3b35fc28..aa98e3cf476 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -1071,6 +1071,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { runTest("compiler/testData/ir/irText/expressions/kt36956.kt"); } + @TestMetadata("kt36963.kt") + public void testKt36963() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt36963.kt"); + } + @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { runTest("compiler/testData/ir/irText/expressions/lambdaInCAO.kt");