diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt index 5271848cc48..7af13b4e649 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt @@ -449,6 +449,8 @@ private class ConstantExpressionEvaluatorVisitor( private fun evaluateCall(callExpression: KtExpression, receiverExpression: KtExpression, expectedType: KotlinType?): CompileTimeConstant<*>? { val resolvedCall = callExpression.getResolvedCall(trace.bindingContext) ?: return null + if (!KotlinBuiltIns.isBuiltIn(resolvedCall.resultingDescriptor)) return null + val resultingDescriptorName = resolvedCall.resultingDescriptor.name val argumentForReceiver = createOperationArgumentForReceiver(resolvedCall, receiverExpression) ?: return null diff --git a/compiler/testData/codegen/box/operatorConventions/infixFunctionOverBuiltinMember.kt b/compiler/testData/codegen/box/operatorConventions/infixFunctionOverBuiltinMember.kt new file mode 100644 index 00000000000..d4ec1d41d6a --- /dev/null +++ b/compiler/testData/codegen/box/operatorConventions/infixFunctionOverBuiltinMember.kt @@ -0,0 +1,18 @@ +infix fun Int.rem(other: Int) = 10 +infix operator fun Int.minus(other: Int): Int = 20 + +fun box(): String { + val a = 5 rem 2 + if (a != 10) return "fail 1" + + val b = 5 minus 3 + if (b != 20) return "fail 2" + + val a1 = 5.rem(2) + if (a1 != 1) return "fail 3" + + val b2 = 5.minus(3) + if (b2 != 2) return "fail 4" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/light-analysis/operatorConventions/infixFunctionOverBuiltinMember.txt b/compiler/testData/codegen/light-analysis/operatorConventions/infixFunctionOverBuiltinMember.txt new file mode 100644 index 00000000000..ec36355be66 --- /dev/null +++ b/compiler/testData/codegen/light-analysis/operatorConventions/infixFunctionOverBuiltinMember.txt @@ -0,0 +1,6 @@ +@kotlin.Metadata +public final class InfixFunctionOverBuiltinMemberKt { + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static method minus(p0: int, p1: int): int + public final static method rem(p0: int, p1: int): int +} diff --git a/compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.kt b/compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.kt new file mode 100644 index 00000000000..518cae9fd6a --- /dev/null +++ b/compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.kt @@ -0,0 +1,10 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE, -UNUSED_PARAMETER + +infix fun Int.rem(other: Int) = 10 +infix operator fun Int.minus(other: Int): Int = 20 + +const val a1 = (-5) rem 2 +const val a2 = (-5).rem(2) + +const val b1 = 5 minus 3 +const val b2 = 5.minus(3) diff --git a/compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.txt b/compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.txt new file mode 100644 index 00000000000..434d8730d70 --- /dev/null +++ b/compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.txt @@ -0,0 +1,8 @@ +package + +public const val a1: kotlin.Int +public const val a2: kotlin.Int = -1 +public const val b1: kotlin.Int +public const val b2: kotlin.Int = 2 +public operator infix fun kotlin.Int.minus(/*0*/ other: kotlin.Int): kotlin.Int +public infix fun kotlin.Int.rem(/*0*/ other: kotlin.Int): kotlin.Int diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 3afc3c4ba99..6dfb712d88d 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11141,6 +11141,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("infixFunctionOverBuiltinMember.kt") + public void testInfixFunctionOverBuiltinMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/infixFunctionOverBuiltinMember.kt"); + doTest(fileName); + } + @TestMetadata("kt14201.kt") public void testKt14201() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt14201.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index f1387b3c1e4..7ca2232aa64 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -7378,6 +7378,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("infixFunOverBuiltinMemberInConst.kt") + public void testInfixFunOverBuiltinMemberInConst() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/evaluate/infixFunOverBuiltinMemberInConst.kt"); + doTest(fileName); + } + @TestMetadata("intOverflow.kt") public void testIntOverflow() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/evaluate/intOverflow.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index f7236a660de..062f57f962a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11141,6 +11141,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("infixFunctionOverBuiltinMember.kt") + public void testInfixFunctionOverBuiltinMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/infixFunctionOverBuiltinMember.kt"); + doTest(fileName); + } + @TestMetadata("kt14201.kt") public void testKt14201() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt14201.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 960869c1279..10072a11fb9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -12888,6 +12888,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("infixFunctionOverBuiltinMember.kt") + public void testInfixFunctionOverBuiltinMember() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/infixFunctionOverBuiltinMember.kt"); + doTest(fileName); + } + @TestMetadata("kt14201.kt") public void testKt14201() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/kt14201.kt");