Skip to content

Commit e34c77b

Browse files
authored
Fix Rational{T} constructor for abstract T (#41229)
1 parent 2f1a958 commit e34c77b

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

base/rational.jl

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,22 @@ unsafe_rational(num::T, den::T) where {T<:Integer} = unsafe_rational(T, num, den
1818
unsafe_rational(num::Integer, den::Integer) = unsafe_rational(promote(num, den)...)
1919

2020
@noinline __throw_rational_argerror_typemin(T) = throw(ArgumentError("invalid rational: denominator can't be typemin($T)"))
21-
function checked_den(num::T, den::T) where T<:Integer
21+
function checked_den(::Type{T}, num::T, den::T) where T<:Integer
2222
if signbit(den)
2323
den = -den
24-
signbit(den) && __throw_rational_argerror_typemin(T)
24+
signbit(den) && __throw_rational_argerror_typemin(typeof(den))
2525
num = -num
2626
end
2727
return unsafe_rational(T, num, den)
2828
end
29+
checked_den(num::T, den::T) where T<:Integer = checked_den(T, num, den)
2930
checked_den(num::Integer, den::Integer) = checked_den(promote(num, den)...)
3031

3132
@noinline __throw_rational_argerror_zero(T) = throw(ArgumentError("invalid rational: zero($T)//zero($T)"))
3233
function Rational{T}(num::Integer, den::Integer) where T<:Integer
3334
iszero(den) && iszero(num) && __throw_rational_argerror_zero(T)
3435
num, den = divgcd(num, den)
35-
return checked_den(T(num), T(den))
36+
return checked_den(T, T(num), T(den))
3637
end
3738

3839
Rational(n::T, d::T) where {T<:Integer} = Rational{T}(n, d)

test/rational.jl

+4
Original file line numberDiff line numberDiff line change
@@ -618,3 +618,7 @@ end
618618
@testset "checked_den with different integer types" begin
619619
@test Base.checked_den(Int8(4), Int32(8)) == Base.checked_den(Int32(4), Int32(8))
620620
end
621+
622+
@testset "Rational{T} with non-concrete T (issue #41222)" begin
623+
@test @inferred(Rational{Integer}(2,3)) isa Rational{Integer}
624+
end

0 commit comments

Comments
 (0)