Fix for KT-15868: NPE when comparing nullable doubles

#KT-15868 Fixed
This commit is contained in:
Mikhael Bogdanov
2017-02-01 15:28:26 +01:00
parent 79bea6710f
commit a2c5c94ee6
21 changed files with 505 additions and 23 deletions
@@ -23,7 +23,11 @@ fun box(): String {
if (!equals5(-0.0, 0.0)) return "fail 5"
if (!equals6(-0.0, 0.0)) return "fail 6"
if (!equals7(-0.0, 0.0)) return "fail 7"
if (!equals8(-0.0, 0.0)) return "fail 8"
if (!equals8(null, null)) return "fail 9"
if (equals8(null, 0.0)) return "fail 10"
if (equals8(0.0, null)) return "fail 11"
return "OK"
}
@@ -0,0 +1,34 @@
fun equals1(a: Float, b: Float?) = a == b
fun equals2(a: Float?, b: Float?) = a!! == b!!
fun equals3(a: Float?, b: Float?) = a != null && a == b
fun equals4(a: Float?, b: Float?) = if (a is Float) a == b else null!!
fun equals5(a: Any?, b: Any?) = if (a is Float && b is Float?) a == b else null!!
fun equals6(a: Any?, b: Any?) = if (a is Float? && b is Float) a == b else null!!
fun equals7(a: Float?, b: Float?) = a == b
fun equals8(a: Any?, b: Any?) = if (a is Float? && b is Float?) a == b else null!!
fun box(): String {
if (!equals1(-0.0F, 0.0F)) return "fail 1"
if (!equals2(-0.0F, 0.0F)) return "fail 2"
if (!equals3(-0.0F, 0.0F)) return "fail 3"
if (!equals4(-0.0F, 0.0F)) return "fail 4"
if (!equals5(-0.0F, 0.0F)) return "fail 5"
if (!equals6(-0.0F, 0.0F)) return "fail 6"
if (!equals7(-0.0F, 0.0F)) return "fail 7"
if (!equals8(-0.0F, 0.0F)) return "fail 8"
if (!equals8(null, null)) return "fail 9"
if (equals8(null, 0.0F)) return "fail 10"
if (equals8(0.0F, null)) return "fail 11"
return "OK"
}
@@ -0,0 +1,25 @@
fun myEquals(a: Double?, b: Double?) = a == b
fun myEquals1(a: Double?, b: Double) = a == b
fun myEquals2(a: Double, b: Double?) = a == b
fun myEquals0(a: Double, b: Double) = a == b
fun box(): String {
if (!myEquals(null, null)) return "fail 1"
if (myEquals(null, 0.0)) return "fail 2"
if (myEquals(0.0, null)) return "fail 3"
if (!myEquals(0.0, 0.0)) return "fail 4"
if (myEquals1(null, 0.0)) return "fail 5"
if (!myEquals1(0.0, 0.0)) return "fail 6"
if (myEquals2(0.0, null)) return "fail 7"
if (!myEquals2(0.0, 0.0)) return "fail 8"
if (!myEquals0(0.0, 0.0)) return "fail 9"
return "OK"
}
@@ -0,0 +1,25 @@
fun myNotEquals(a: Double?, b: Double?) = a != b
fun myNotEquals1(a: Double?, b: Double) = a != b
fun myNotEquals2(a: Double, b: Double?) = a != b
fun myNotEquals0(a: Double, b: Double) = a != b
fun box(): String {
if (myNotEquals(null, null)) return "fail 1"
if (!myNotEquals(null, 0.0)) return "fail 2"
if (!myNotEquals(0.0, null)) return "fail 3"
if (myNotEquals(0.0, 0.0)) return "fail 4"
if (!myNotEquals1(null, 0.0)) return "fail 5"
if (myNotEquals1(0.0, 0.0)) return "fail 6"
if (!myNotEquals2(0.0, null)) return "fail 7"
if (myNotEquals2(0.0, 0.0)) return "fail 8"
if (myNotEquals0(0.0, 0.0)) return "fail 9"
return "OK"
}
@@ -0,0 +1,25 @@
fun myEquals(a: Float?, b: Float?) = a == b
fun myEquals1(a: Float?, b: Float) = a == b
fun myEquals2(a: Float, b: Float?) = a == b
fun myEquals0(a: Float, b: Float) = a == b
fun box(): String {
if (!myEquals(null, null)) return "fail 1"
if (myEquals(null, 0.0F)) return "fail 2"
if (myEquals(0.0F, null)) return "fail 3"
if (!myEquals(0.0F, 0.0F)) return "fail 4"
if (myEquals1(null, 0.0F)) return "fail 5"
if (!myEquals1(0.0F, 0.0F)) return "fail 6"
if (myEquals2(0.0F, null)) return "fail 7"
if (!myEquals2(0.0F, 0.0F)) return "fail 8"
if (!myEquals0(0.0F, 0.0F)) return "fail 9"
return "OK"
}
@@ -0,0 +1,25 @@
fun myNotEquals(a: Float?, b: Float?) = a != b
fun myNotEquals1(a: Float?, b: Float) = a != b
fun myNotEquals2(a: Float, b: Float?) = a != b
fun myNotEquals0(a: Float, b: Float) = a != b
fun box(): String {
if (myNotEquals(null, null)) return "fail 1"
if (!myNotEquals(null, 0.0F)) return "fail 2"
if (!myNotEquals(0.0F, null)) return "fail 3"
if (myNotEquals(0.0F, 0.0F)) return "fail 4"
if (!myNotEquals1(null, 0.0F)) return "fail 5"
if (myNotEquals1(0.0F, 0.0F)) return "fail 6"
if (!myNotEquals2(0.0F, null)) return "fail 7"
if (myNotEquals2(0.0F, 0.0F)) return "fail 8"
if (myNotEquals0(0.0F, 0.0F)) return "fail 9"
return "OK"
}
@@ -0,0 +1,26 @@
//NB: special ieee754 arithmetic logic is not applied to Int comparison
fun myEquals(a: Int?, b: Int?) = a == b
fun myEquals1(a: Int?, b: Int) = a == b
fun myEquals2(a: Int, b: Int?) = a == b
fun myEquals0(a: Int, b: Int) = a == b
fun box(): String {
if (!myEquals(null, null)) return "fail 1"
if (myEquals(null, 0)) return "fail 2"
if (myEquals(0, null)) return "fail 3"
if (!myEquals(0, 0)) return "fail 4"
if (myEquals1(null, 0)) return "fail 5"
if (!myEquals1(0, 0)) return "fail 6"
if (myEquals2(0, null)) return "fail 7"
if (!myEquals2(0, 0)) return "fail 8"
if (!myEquals0(0, 0)) return "fail 9"
return "OK"
}
+8 -2
View File
@@ -35,8 +35,14 @@ fun box(): String {
if (jClass.minus0() != jClass.plus0()) return "fail 5"
//TODO: KT-14989
//if (jClass.null0() != jClass.plus0()) return "fail 6"
var value = jClass.minus0() == jClass.plus0()
if (!value) return "fail 6"
if (jClass.null0() == jClass.plus0()) return "fail 7"
if (jClass.plus0() == jClass.null0()) return "fail 8"
value = jClass.null0() == jClass.null0()
if (!value) return "fail 9"
return "OK"
}
+8 -2
View File
@@ -38,8 +38,14 @@ fun box(): String {
if (jClass.minus0() != jClass.plus0()) return "fail 5"
//TODO: KT-14989
//if (jClass.null0() != jClass.plus0()) return "fail 6"
var value = jClass.minus0() == jClass.plus0()
if (!value) return "fail 6"
if (jClass.null0() == jClass.plus0()) return "fail 7"
if (jClass.plus0() == jClass.null0()) return "fail 8"
value = jClass.null0() == jClass.null0()
if (!value) return "fail 9"
return "OK"
}
@@ -0,0 +1,12 @@
@kotlin.Metadata
public final class EqualsNullableFloatKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method equals1(p0: float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method equals2(@org.jetbrains.annotations.Nullable p0: java.lang.Float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method equals3(@org.jetbrains.annotations.Nullable p0: java.lang.Float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method equals4(@org.jetbrains.annotations.Nullable p0: java.lang.Float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method equals5(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
public final static method equals6(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
public final static method equals7(@org.jetbrains.annotations.Nullable p0: java.lang.Float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method equals8(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean
}
@@ -0,0 +1,8 @@
@kotlin.Metadata
public final class NullableDoubleEqualsKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method myNotEquals(@org.jetbrains.annotations.Nullable p0: java.lang.Double, @org.jetbrains.annotations.Nullable p1: java.lang.Double): boolean
public final static method myNotEquals0(p0: double, p1: double): boolean
public final static method myNotEquals1(@org.jetbrains.annotations.Nullable p0: java.lang.Double, p1: double): boolean
public final static method myNotEquals2(p0: double, @org.jetbrains.annotations.Nullable p1: java.lang.Double): boolean
}
@@ -0,0 +1,8 @@
@kotlin.Metadata
public final class NullableDoubleNotEqualsKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method myEquals(@org.jetbrains.annotations.Nullable p0: java.lang.Double, @org.jetbrains.annotations.Nullable p1: java.lang.Double): boolean
public final static method myEquals0(p0: double, p1: double): boolean
public final static method myEquals1(@org.jetbrains.annotations.Nullable p0: java.lang.Double, p1: double): boolean
public final static method myEquals2(p0: double, @org.jetbrains.annotations.Nullable p1: java.lang.Double): boolean
}
@@ -0,0 +1,8 @@
@kotlin.Metadata
public final class NullableFloatEqualsKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method myEquals(@org.jetbrains.annotations.Nullable p0: java.lang.Float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method myEquals0(p0: float, p1: float): boolean
public final static method myEquals1(@org.jetbrains.annotations.Nullable p0: java.lang.Float, p1: float): boolean
public final static method myEquals2(p0: float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
}
@@ -0,0 +1,8 @@
@kotlin.Metadata
public final class NullableFloatNotEqualsKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method myNotEquals(@org.jetbrains.annotations.Nullable p0: java.lang.Float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
public final static method myNotEquals0(p0: float, p1: float): boolean
public final static method myNotEquals1(@org.jetbrains.annotations.Nullable p0: java.lang.Float, p1: float): boolean
public final static method myNotEquals2(p0: float, @org.jetbrains.annotations.Nullable p1: java.lang.Float): boolean
}
@@ -0,0 +1,8 @@
@kotlin.Metadata
public final class NullableIntEqualsKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method myEquals(@org.jetbrains.annotations.Nullable p0: java.lang.Integer, @org.jetbrains.annotations.Nullable p1: java.lang.Integer): boolean
public final static method myEquals0(p0: int, p1: int): boolean
public final static method myEquals1(@org.jetbrains.annotations.Nullable p0: java.lang.Integer, p1: int): boolean
public final static method myEquals2(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Integer): boolean
}