Fix internal compiler error about arithmetic exception
#KT-8264 Fixed
This commit is contained in:
+7
-1
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
import org.jetbrains.kotlin.resolve.*
|
||||
@@ -242,6 +243,11 @@ class ConstantExpressionEvaluator(
|
||||
}
|
||||
}
|
||||
|
||||
private val DIVISION_OPERATION_NAMES =
|
||||
listOf(OperatorNameConventions.DIV, OperatorNameConventions.REM, OperatorNameConventions.MOD)
|
||||
.map(Name::asString)
|
||||
.toSet()
|
||||
|
||||
private class ConstantExpressionEvaluatorVisitor(
|
||||
private val constantExpressionEvaluator: ConstantExpressionEvaluator,
|
||||
private val trace: BindingTrace
|
||||
@@ -545,7 +551,7 @@ private class ConstantExpressionEvaluatorVisitor(
|
||||
binaryOperations[BinaryOperationKey(receiver.ctcType, parameter.ctcType, name)]
|
||||
|
||||
private fun isDivisionByZero(name: String, parameter: Any?): Boolean {
|
||||
if (name == OperatorConventions.BINARY_OPERATION_NAMES[KtTokens.DIV]!!.asString()) {
|
||||
if (name in DIVISION_OPERATION_NAMES) {
|
||||
if (isIntegerType(parameter)) {
|
||||
return (parameter as Number).toLong() == 0.toLong()
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ const val delegated: Int <!CONST_VAL_WITH_DELEGATE!>by Delegate()<!>
|
||||
|
||||
|
||||
const val withGetter: Int
|
||||
<!CONST_VAL_WITH_GETTER!>get() = 13<!>
|
||||
<!CONST_VAL_WITH_GETTER!>get() = 13<!>
|
||||
|
||||
const val withExplicitDefaultGetter: Int = 1
|
||||
<!CONST_VAL_WITH_GETTER!>get<!>
|
||||
@@ -80,6 +80,11 @@ 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 nonConstInitializer11 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 % 0<!>
|
||||
const val nonConstInitializer12 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0 % 0<!>
|
||||
const val nonConstInitializer13 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.<!DEPRECATION!>mod<!>(0)<!>
|
||||
const val nonConstInitializer14 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.rem(0)<!>
|
||||
const val nonConstInitializer15 = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.div(0)<!>
|
||||
|
||||
const val constInitializer1 = 1.0/0
|
||||
const val constInitializer2 = 1/0.0
|
||||
@@ -90,6 +95,12 @@ 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
|
||||
const val constInitializer10 = 1.0 % 0
|
||||
const val constInitializer11 = 0.0 % 0
|
||||
const val constInitializer12 = (-1.0) % 0
|
||||
const val constInitializer13 = 1.0.rem(0)
|
||||
const val constInitializer14 = 1.0.<!DEPRECATION!>mod<!>(0)
|
||||
const val constInitializer15 = 1.0.div(0)
|
||||
|
||||
// ------------------
|
||||
class Delegate {
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package
|
||||
|
||||
public const val constInitializer1: kotlin.Double = Infinity.toDouble()
|
||||
public const val constInitializer10: kotlin.Double = NaN.toDouble()
|
||||
public const val constInitializer11: kotlin.Double = NaN.toDouble()
|
||||
public const val constInitializer12: kotlin.Double = NaN.toDouble()
|
||||
public const val constInitializer13: kotlin.Double = NaN.toDouble()
|
||||
public const val constInitializer14: kotlin.Double = NaN.toDouble()
|
||||
public const val constInitializer15: 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()
|
||||
@@ -13,6 +19,11 @@ 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 nonConstInitializer11: kotlin.Int
|
||||
public const val nonConstInitializer12: kotlin.Int
|
||||
public const val nonConstInitializer13: kotlin.Int
|
||||
public const val nonConstInitializer14: kotlin.Int
|
||||
public const val nonConstInitializer15: kotlin.Int
|
||||
public const val nonConstInitializer2: kotlin.String
|
||||
public const val nonConstInitializer3: kotlin.String
|
||||
public const val nonConstInitializer4: kotlin.Double
|
||||
|
||||
+10
@@ -4,8 +4,18 @@
|
||||
const val a = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 / 0.0<!>
|
||||
const val b = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1.0 / 0<!>
|
||||
const val c = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.0 / 0<!>
|
||||
const val d = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1.0 % 0<!>
|
||||
const val e = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.0 % 0<!>
|
||||
const val f = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.0.<!DEPRECATION!>mod<!>(0)<!>
|
||||
const val g = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.0.rem(0)<!>
|
||||
const val h = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>0.0.div(0)<!>
|
||||
|
||||
const val i = <!CONST_VAL_WITH_NON_CONST_INITIALIZER!>1 / 0<!>
|
||||
|
||||
val nonConst1 = 1.0 / 0
|
||||
val nonConst2 = 1 / 0
|
||||
val nonConst3 = 1.0 % 0
|
||||
val nonConst4 = 1 % 0
|
||||
val nonConst5 = 1.<!DEPRECATION!>mod<!>(0)
|
||||
val nonConst6 = 1.rem(0)
|
||||
val nonConst7 = 1.div(0)
|
||||
|
||||
+10
@@ -3,6 +3,16 @@ package
|
||||
public const val a: kotlin.Double
|
||||
public const val b: kotlin.Double
|
||||
public const val c: kotlin.Double
|
||||
public const val d: kotlin.Double
|
||||
public const val e: kotlin.Double
|
||||
public const val f: kotlin.Double
|
||||
public const val g: kotlin.Double
|
||||
public const val h: kotlin.Double
|
||||
public const val i: kotlin.Int
|
||||
public val nonConst1: kotlin.Double
|
||||
public val nonConst2: kotlin.Int
|
||||
public val nonConst3: kotlin.Double
|
||||
public val nonConst4: kotlin.Int
|
||||
public val nonConst5: kotlin.Int
|
||||
public val nonConst6: kotlin.Int
|
||||
public val nonConst7: kotlin.Int
|
||||
|
||||
+25
-1
@@ -55,4 +55,28 @@ val prop17 = -0.0 / 0
|
||||
val prop18 = 1.0 / 0 - 1.0 / 0
|
||||
|
||||
// val prop19: NaN.toFloat()
|
||||
val prop19 = 1f / 0 - 1f / 0
|
||||
val prop19 = 1f / 0 - 1f / 0
|
||||
|
||||
// val prop20: NaN.toDouble()
|
||||
val prop20 = 1.0 % 0
|
||||
|
||||
// val prop21: NaN.toDouble()
|
||||
val prop21 = 0.0 % 0
|
||||
|
||||
// val prop22: NaN.toFloat()
|
||||
val prop22 = 1f % 0
|
||||
|
||||
// val prop23: NaN.toDouble()
|
||||
val prop23 = -1.0 % 0
|
||||
|
||||
// val prop24: NaN.toDouble()
|
||||
val prop24 = -0.0 % 0
|
||||
|
||||
// val prop25: NaN.toDouble()
|
||||
val prop25 = 1.0.mod(0)
|
||||
|
||||
// val prop26: NaN.toDouble()
|
||||
val prop26 = 1.0.rem(0)
|
||||
|
||||
// val prop27: Infinity.toDouble()
|
||||
val prop27 = 1.0.div(0)
|
||||
Reference in New Issue
Block a user