From faef9d701dd31eb48274f7feb6527748f991aef3 Mon Sep 17 00:00:00 2001 From: Mark Kittisopikul Date: Wed, 24 Feb 2021 04:00:51 -0500 Subject: [PATCH 1/3] Fix #39798 by using oneunit(start) rather than `1` for _linrange --- base/twiceprecision.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/twiceprecision.jl b/base/twiceprecision.jl index 4df9c072f78ee..1e936e0588a7a 100644 --- a/base/twiceprecision.jl +++ b/base/twiceprecision.jl @@ -673,7 +673,7 @@ end # range for rational numbers, start = start_n/den, stop = stop_n/den # Note this returns a StepRangeLen -_linspace(::Type{T}, start::Integer, stop::Integer, len::Integer) where {T<:IEEEFloat} = _linspace(T, start, stop, len, 1) +_linspace(::Type{T}, start::Integer, stop::Integer, len::Integer) where {T<:IEEEFloat} = _linspace(T, start, stop, len, oneunit(start)) function _linspace(::Type{T}, start_n::Integer, stop_n::Integer, len::Integer, den::Integer) where T<:IEEEFloat len < 2 && return _linspace1(T, start_n/den, stop_n/den, len) start_n == stop_n && return steprangelen_hp(T, (start_n, den), (zero(start_n), den), 0, len, 1) From b81be5116b2846168a5269a9012f9524065a0bfa Mon Sep 17 00:00:00 2001 From: Mark Kittisopikul Date: Sun, 28 Mar 2021 00:26:39 -0400 Subject: [PATCH 2/3] Test for #39798 --- test/ranges.jl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/ranges.jl b/test/ranges.jl index fd12a0829ce5e..b800e6dc44d5b 100644 --- a/test/ranges.jl +++ b/test/ranges.jl @@ -1899,3 +1899,14 @@ end @test_throws BoundsError r[true:true:false] @test_throws BoundsError r[true:true:true] end +@testset "Non-Int64 endpoints that are identical (#39798)" begin + for T in DataType[Float64,Int8,Int16,Int32,Int64,Int128,UInt8,UInt16,UInt32,UInt64], + r in [ LinRange(1, 1, 10), StepRangeLen(7, 0 , 5) ] + let start=T(first(r)), stop=T(last(r)), step=T(step(r)), length=length(r) + @test range( start, stop, length) == r + @test range( start, stop; length) == r + @test range( start; stop, length) == r + @test range(; start, stop, length) == r + end + end +end From 52476fa8c86232a12d857bc67f1e855e06c9a577 Mon Sep 17 00:00:00 2001 From: Mark Kittisopikul Date: Thu, 25 Feb 2021 04:12:15 -0500 Subject: [PATCH 3/3] Expand tests for #39798 --- test/ranges.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/ranges.jl b/test/ranges.jl index b800e6dc44d5b..6a48d6ea8967a 100644 --- a/test/ranges.jl +++ b/test/ranges.jl @@ -1900,8 +1900,11 @@ end @test_throws BoundsError r[true:true:true] end @testset "Non-Int64 endpoints that are identical (#39798)" begin - for T in DataType[Float64,Int8,Int16,Int32,Int64,Int128,UInt8,UInt16,UInt32,UInt64], - r in [ LinRange(1, 1, 10), StepRangeLen(7, 0 , 5) ] + for T in DataType[Float16,Float32,Float64,Bool,Int8,Int16,Int32,Int64,Int128,UInt8,UInt16,UInt32,UInt64,UInt128], + r in [ LinRange(1, 1, 10), StepRangeLen(7, 0, 5) ] + if first(r) > typemax(T) + continue + end let start=T(first(r)), stop=T(last(r)), step=T(step(r)), length=length(r) @test range( start, stop, length) == r @test range( start, stop; length) == r