Fix internal compiler error about arithmetic exception

#KT-8264 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2017-01-25 17:17:31 +03:00
parent ca86dbee72
commit b0c3c7463b
6 changed files with 75 additions and 3 deletions
@@ -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
@@ -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)
@@ -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
View File
@@ -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)