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 a0e0458004d..20dcfcfe887 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 @@ -455,7 +455,10 @@ private class ConstantExpressionEvaluatorVisitor( if (isDivisionByZero(resultingDescriptorName.asString(), argumentForParameter.value)) { val parentExpression: KtExpression = PsiTreeUtil.getParentOfType(receiverExpression, KtExpression::class.java)!! trace.report(Errors.DIVISION_BY_ZERO.on(parentExpression)) - return factory.createErrorValue("Division by zero").wrap() + + if (isIntegerType(argumentForReceiver.value) && isIntegerType(argumentForParameter.value)) { + return factory.createErrorValue("Division by zero").wrap() + } } val result = evaluateBinaryAndCheck(argumentForReceiver, argumentForParameter, resultingDescriptorName.asString(), callExpression) ?: return null diff --git a/compiler/testData/diagnostics/tests/modifiers/const/applicability.kt b/compiler/testData/diagnostics/tests/modifiers/const/applicability.kt index 6a646d957d0..5d10c919f39 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/applicability.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/applicability.kt @@ -1,4 +1,4 @@ -// !DIAGNOSTICS:-UNUSED_VARIABLE,-CAST_NEVER_SUCCEEDS +// !DIAGNOSTICS:-UNUSED_VARIABLE,-CAST_NEVER_SUCCEEDS,-DIVISION_BY_ZERO import kotlin.reflect.KProperty @@ -75,6 +75,21 @@ const val nonConstInitializer2 = 1 as St const val nonConstInitializer3 = 1.0 as String const val nonConstInitializer4 = 1 as Double const val nonConstInitializer5 = "2" as Int +const val nonConstInitializer6 = 1/0 +const val nonConstInitializer7 = -1/0 +const val nonConstInitializer8 = 1/0 - 1/0 +const val nonConstInitializer9 = 1.0/0.0 - 1/0 +const val nonConstInitializer10 = 0/0 + +const val constInitializer1 = 1.0/0 +const val constInitializer2 = 1/0.0 +const val constInitializer3 = 1.0/0.0 +const val constInitializer4 = -1.0/0 +const val constInitializer5 = 0.0/0 +const val constInitializer6 = 42 + 1.0/0 +const val constInitializer7 = 42 - 1.0/0 +const val constInitializer8 = 1.0/0 - 1.0/0 +const val constInitializer9 = 0.0/0 + 1.0/0 // ------------------ class Delegate { diff --git a/compiler/testData/diagnostics/tests/modifiers/const/applicability.txt b/compiler/testData/diagnostics/tests/modifiers/const/applicability.txt index 83194ca3c22..815a225cc83 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/applicability.txt +++ b/compiler/testData/diagnostics/tests/modifiers/const/applicability.txt @@ -1,12 +1,26 @@ package +public const val constInitializer1: kotlin.Double = Infinity.toDouble() +public const val constInitializer2: kotlin.Double = Infinity.toDouble() +public const val constInitializer3: kotlin.Double = Infinity.toDouble() +public const val constInitializer4: kotlin.Double = -Infinity.toDouble() +public const val constInitializer5: kotlin.Double = NaN.toDouble() +public const val constInitializer6: kotlin.Double = Infinity.toDouble() +public const val constInitializer7: kotlin.Double = -Infinity.toDouble() +public const val constInitializer8: kotlin.Double = NaN.toDouble() +public const val constInitializer9: kotlin.Double = NaN.toDouble() public const val defaultGetter: kotlin.Int = 19 public const val delegated: kotlin.Int public const val nonConstInitializer1: kotlin.Int +public const val nonConstInitializer10: kotlin.Int public const val nonConstInitializer2: kotlin.String public const val nonConstInitializer3: kotlin.String public const val nonConstInitializer4: kotlin.Double public const val nonConstInitializer5: kotlin.Int +public const val nonConstInitializer6: kotlin.Int +public const val nonConstInitializer7: kotlin.Int +public const val nonConstInitializer8: kotlin.Int +public const val nonConstInitializer9: kotlin.Double private val privateTopLevel: kotlin.Int = 3 public const var topLeveLVar: kotlin.Int public const val topLevel: kotlin.Int = 0 diff --git a/compiler/testData/evaluate/constant/divideByZero.kt b/compiler/testData/evaluate/constant/divideByZero.kt index 2cfc49b8f3e..71293e89d45 100644 --- a/compiler/testData/evaluate/constant/divideByZero.kt +++ b/compiler/testData/evaluate/constant/divideByZero.kt @@ -3,10 +3,10 @@ package test // val prop1: null val prop1 = 1 / 0 -// val prop2: null +// val prop2: Infinity.toDouble() val prop2 = 1 / 0.0 -// val prop3: null +// val prop3: Infinity.toDouble() val prop3 = 1.0 / 0 // val prop4: 10.0.toDouble() @@ -15,20 +15,44 @@ val prop4 = 1 / 0.1 // val prop5: null val prop5 = 1 / 0.toLong() -// val prop6: null +// val prop6: Infinity.toDouble() val prop6 = 1.0 / 0.toInt() -// val prop7: null +// val prop7: Infinity.toDouble() val prop7 = 1.0 / 0.toLong() -// val prop8: null +// val prop8: Infinity.toDouble() val prop8 = 1.0 / 0.toByte() -// val prop9: null +// val prop9: Infinity.toDouble() val prop9 = 1.0 / 0.toShort() -// val prop10: null +// val prop10: Infinity.toDouble() val prop10 = 1.0 / 0.toFloat() -// val prop11: null -val prop11 = 1.0 / 0.toDouble() \ No newline at end of file +// val prop11: Infinity.toDouble() +val prop11 = 1.0 / 0.toDouble() + +// val prop12: -Infinity.toDouble() +val prop12 = -1.0 / 0 + +// val prop13: Infinity.toFloat() +val prop13 = 1f / 0 + +// val prop14: -Infinity.toFloat() +val prop14 = -1f / 0 + +// val prop15: NaN.toDouble() +val prop15 = 0.0 / 0 + +// val prop16: NaN.toFloat() +val prop16 = 0f / 0 + +// val prop17: NaN.toDouble() +val prop17 = -0.0 / 0 + +// val prop18: NaN.toDouble() +val prop18 = 1.0 / 0 - 1.0 / 0 + +// val prop19: NaN.toFloat() +val prop19 = 1f / 0 - 1f / 0 \ No newline at end of file