From d91f3cba0b528189be40d267a485525e7fd71ff7 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 4 Nov 2016 05:01:08 +0300 Subject: [PATCH] Add additional invariant to check in Range.contains optimization tests. Change expectations for double and float ranges according to #KT-4481 #KT-5044 #KT-4481 Custom 'rangeTo' might be unoptimized, but still 'in' should not diverge from 'contains'. --- .../box/ranges/contains/inComparableRange.kt | 24 +++++++++++++++++++ .../contains/inOptimizableDoubleRange.kt | 11 +++++---- .../contains/inOptimizableFloatRange.kt | 11 +++++---- .../ranges/contains/inOptimizableIntRange.kt | 5 +++- .../ranges/contains/inOptimizableLongRange.kt | 5 +++- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/compiler/testData/codegen/box/ranges/contains/inComparableRange.kt b/compiler/testData/codegen/box/ranges/contains/inComparableRange.kt index bc556976181..b74fd27a010 100644 --- a/compiler/testData/codegen/box/ranges/contains/inComparableRange.kt +++ b/compiler/testData/codegen/box/ranges/contains/inComparableRange.kt @@ -10,6 +10,24 @@ class ComparablePair>(val first: T, val second: T) : Comparabl } } +fun > genericRangeTo(start: T, endInclusive: T) = start..endInclusive +operator fun Double.rangeTo(other: Double) = genericRangeTo(this, other) +operator fun Float.rangeTo(other: Float) = ClosedFloatRange(this, other) + +fun check(x: Double, left: Double, right: Double): Boolean { + val result = x in left..right + val range = left..right + assert(result == x in range) { "Failed: unoptimized === unoptimized for custom double $range" } + return result +} + +fun check(x: Float, left: Float, right: Float): Boolean { + val result = x in left..right + val range = left..right + assert(result == x in range) { "Failed: unoptimized === unoptimized for standard float $range" } + return result +} + fun box(): String { assert("a" !in "b".."c") assert("b" in "a".."d") @@ -17,5 +35,11 @@ fun box(): String { assert(ComparablePair(2, 2) !in ComparablePair(1, 10)..ComparablePair(2, 1)) assert(ComparablePair(2, 2) in ComparablePair(2, 0)..ComparablePair(2, 10)) + assert(!check(-0.0, 0.0, 0.0)) + assert(check(Double.NaN, Double.NaN, Double.NaN)) + + assert(check(-0.0f, 0.0f, 0.0f)) + assert(!check(Float.NaN, Float.NaN, Float.NaN)) + return "OK" } diff --git a/compiler/testData/codegen/box/ranges/contains/inOptimizableDoubleRange.kt b/compiler/testData/codegen/box/ranges/contains/inOptimizableDoubleRange.kt index 532d8a9d565..f7aa5bf5729 100644 --- a/compiler/testData/codegen/box/ranges/contains/inOptimizableDoubleRange.kt +++ b/compiler/testData/codegen/box/ranges/contains/inOptimizableDoubleRange.kt @@ -5,7 +5,10 @@ fun check(x: Double, left: Double, right: Double): Boolean { val result = x in left..right - assert(result == checkUnoptimized(x, left..right)) + val manual = x >= left && x <= right + val range = left..right + assert(result == manual) { "Failed: optimized === manual for $range" } + assert(result == checkUnoptimized(x, range)) { "Failed: optimized === unoptimized for $range" } return result } @@ -19,13 +22,13 @@ fun box(): String { assert(check(Double.MIN_VALUE, 0.0, 1.0)) assert(check(Double.MAX_VALUE, Double.MAX_VALUE - Double.MIN_VALUE, Double.MAX_VALUE)) - assert(check(Double.NaN, Double.NaN, Double.NaN)) + assert(!check(Double.NaN, Double.NaN, Double.NaN)) assert(!check(0.0, Double.NaN, Double.NaN)) assert(check(-0.0, -0.0, +0.0)) assert(check(-0.0, -0.0, -0.0)) - assert(!check(-0.0, +0.0, +0.0)) - assert(!check(+0.0, -0.0, -0.0)) + assert(check(-0.0, +0.0, +0.0)) + assert(check(+0.0, -0.0, -0.0)) assert(check(+0.0, +0.0, +0.0)) assert(check(+0.0, -0.0, +0.0)) diff --git a/compiler/testData/codegen/box/ranges/contains/inOptimizableFloatRange.kt b/compiler/testData/codegen/box/ranges/contains/inOptimizableFloatRange.kt index 151860e7c9d..8b21a83ad34 100644 --- a/compiler/testData/codegen/box/ranges/contains/inOptimizableFloatRange.kt +++ b/compiler/testData/codegen/box/ranges/contains/inOptimizableFloatRange.kt @@ -5,7 +5,10 @@ fun check(x: Float, left: Float, right: Float): Boolean { val result = x in left..right - assert(result == checkUnoptimized(x, left..right)) + val manual = x >= left && x <= right + val range = left..right + assert(result == manual) { "Failed: optimized === manual for $range" } + assert(result == checkUnoptimized(x, range)) { "Failed: optimized === unoptimized for $range" } return result } @@ -19,13 +22,13 @@ fun box(): String { assert(check(Float.MIN_VALUE, 0.0f, 1.0f)) assert(check(Float.MAX_VALUE, Float.MAX_VALUE - Float.MIN_VALUE, Float.MAX_VALUE)) - assert(check(Float.NaN, Float.NaN, Float.NaN)) + assert(!check(Float.NaN, Float.NaN, Float.NaN)) assert(!check(0.0f, Float.NaN, Float.NaN)) assert(check(-0.0f, -0.0f, +0.0f)) assert(check(-0.0f, -0.0f, -0.0f)) - assert(!check(-0.0f, +0.0f, +0.0f)) - assert(!check(+0.0f, -0.0f, -0.0f)) + assert(check(-0.0f, +0.0f, +0.0f)) + assert(check(+0.0f, -0.0f, -0.0f)) assert(check(+0.0f, +0.0f, +0.0f)) assert(check(+0.0f, -0.0f, +0.0f)) diff --git a/compiler/testData/codegen/box/ranges/contains/inOptimizableIntRange.kt b/compiler/testData/codegen/box/ranges/contains/inOptimizableIntRange.kt index eace6c923dc..9f4a914c9d1 100644 --- a/compiler/testData/codegen/box/ranges/contains/inOptimizableIntRange.kt +++ b/compiler/testData/codegen/box/ranges/contains/inOptimizableIntRange.kt @@ -5,7 +5,10 @@ fun check(x: Int, left: Int, right: Int): Boolean { val result = x in left..right - assert(result == checkUnoptimized(x, left..right)) + val manual = x >= left && x <= right + val range = left..right + assert(result == manual) { "Failed: optimized === manual for $range" } + assert(result == checkUnoptimized(x, range)) { "Failed: optimized === unoptimized for $range" } return result } diff --git a/compiler/testData/codegen/box/ranges/contains/inOptimizableLongRange.kt b/compiler/testData/codegen/box/ranges/contains/inOptimizableLongRange.kt index 3db34b40b18..8bf77137b1a 100644 --- a/compiler/testData/codegen/box/ranges/contains/inOptimizableLongRange.kt +++ b/compiler/testData/codegen/box/ranges/contains/inOptimizableLongRange.kt @@ -5,7 +5,10 @@ fun check(x: Long, left: Long, right: Long): Boolean { val result = x in left..right - assert(result == checkUnoptimized(x, left..right)) + val manual = x >= left && x <= right + val range = left..right + assert(result == manual) { "Failed: optimized === manual for $range" } + assert(result == checkUnoptimized(x, range)) { "Failed: optimized === unoptimized for $range" } return result }