Support Infinity and NaN in constant evaluator
This allows to store infinities and NaNs inside const vals
This commit is contained in:
+4
-1
@@ -455,7 +455,10 @@ private class ConstantExpressionEvaluatorVisitor(
|
|||||||
if (isDivisionByZero(resultingDescriptorName.asString(), argumentForParameter.value)) {
|
if (isDivisionByZero(resultingDescriptorName.asString(), argumentForParameter.value)) {
|
||||||
val parentExpression: KtExpression = PsiTreeUtil.getParentOfType(receiverExpression, KtExpression::class.java)!!
|
val parentExpression: KtExpression = PsiTreeUtil.getParentOfType(receiverExpression, KtExpression::class.java)!!
|
||||||
trace.report(Errors.DIVISION_BY_ZERO.on(parentExpression))
|
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
|
val result = evaluateBinaryAndCheck(argumentForReceiver, argumentForParameter, resultingDescriptorName.asString(), callExpression) ?: return null
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// !DIAGNOSTICS:-UNUSED_VARIABLE,-CAST_NEVER_SUCCEEDS
|
// !DIAGNOSTICS:-UNUSED_VARIABLE,-CAST_NEVER_SUCCEEDS,-DIVISION_BY_ZERO
|
||||||
|
|
||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
@@ -75,6 +75,21 @@ const val nonConstInitializer2 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 as St
|
|||||||
const val nonConstInitializer3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1.0 as String<!>
|
const val nonConstInitializer3 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1.0 as String<!>
|
||||||
const val nonConstInitializer4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 as Double<!>
|
const val nonConstInitializer4 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 as Double<!>
|
||||||
const val nonConstInitializer5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"2" as Int<!>
|
const val nonConstInitializer5 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>"2" as Int<!>
|
||||||
|
const val nonConstInitializer6 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1/0<!>
|
||||||
|
const val nonConstInitializer7 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>-1/0<!>
|
||||||
|
const val nonConstInitializer8 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1/0 - 1/0<!>
|
||||||
|
const val nonConstInitializer9 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1.0/0.0 - 1/0<!>
|
||||||
|
const val nonConstInitializer10 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>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 {
|
class Delegate {
|
||||||
|
|||||||
@@ -1,12 +1,26 @@
|
|||||||
package
|
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 defaultGetter: kotlin.Int = 19
|
||||||
public const val delegated: kotlin.Int
|
public const val delegated: kotlin.Int
|
||||||
public const val nonConstInitializer1: kotlin.Int
|
public const val nonConstInitializer1: kotlin.Int
|
||||||
|
public const val nonConstInitializer10: kotlin.Int
|
||||||
public const val nonConstInitializer2: kotlin.String
|
public const val nonConstInitializer2: kotlin.String
|
||||||
public const val nonConstInitializer3: kotlin.String
|
public const val nonConstInitializer3: kotlin.String
|
||||||
public const val nonConstInitializer4: kotlin.Double
|
public const val nonConstInitializer4: kotlin.Double
|
||||||
public const val nonConstInitializer5: kotlin.Int
|
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
|
private val privateTopLevel: kotlin.Int = 3
|
||||||
public const var topLeveLVar: kotlin.Int
|
public const var topLeveLVar: kotlin.Int
|
||||||
public const val topLevel: kotlin.Int = 0
|
public const val topLevel: kotlin.Int = 0
|
||||||
|
|||||||
+32
-8
@@ -3,10 +3,10 @@ package test
|
|||||||
// val prop1: null
|
// val prop1: null
|
||||||
val prop1 = 1 / 0
|
val prop1 = 1 / 0
|
||||||
|
|
||||||
// val prop2: null
|
// val prop2: Infinity.toDouble()
|
||||||
val prop2 = 1 / 0.0
|
val prop2 = 1 / 0.0
|
||||||
|
|
||||||
// val prop3: null
|
// val prop3: Infinity.toDouble()
|
||||||
val prop3 = 1.0 / 0
|
val prop3 = 1.0 / 0
|
||||||
|
|
||||||
// val prop4: 10.0.toDouble()
|
// val prop4: 10.0.toDouble()
|
||||||
@@ -15,20 +15,44 @@ val prop4 = 1 / 0.1
|
|||||||
// val prop5: null
|
// val prop5: null
|
||||||
val prop5 = 1 / 0.toLong()
|
val prop5 = 1 / 0.toLong()
|
||||||
|
|
||||||
// val prop6: null
|
// val prop6: Infinity.toDouble()
|
||||||
val prop6 = 1.0 / 0.toInt()
|
val prop6 = 1.0 / 0.toInt()
|
||||||
|
|
||||||
// val prop7: null
|
// val prop7: Infinity.toDouble()
|
||||||
val prop7 = 1.0 / 0.toLong()
|
val prop7 = 1.0 / 0.toLong()
|
||||||
|
|
||||||
// val prop8: null
|
// val prop8: Infinity.toDouble()
|
||||||
val prop8 = 1.0 / 0.toByte()
|
val prop8 = 1.0 / 0.toByte()
|
||||||
|
|
||||||
// val prop9: null
|
// val prop9: Infinity.toDouble()
|
||||||
val prop9 = 1.0 / 0.toShort()
|
val prop9 = 1.0 / 0.toShort()
|
||||||
|
|
||||||
// val prop10: null
|
// val prop10: Infinity.toDouble()
|
||||||
val prop10 = 1.0 / 0.toFloat()
|
val prop10 = 1.0 / 0.toFloat()
|
||||||
|
|
||||||
// val prop11: null
|
// val prop11: Infinity.toDouble()
|
||||||
val prop11 = 1.0 / 0.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
|
||||||
Reference in New Issue
Block a user