diff --git a/stdlib/SparseArrays/src/linalg.jl b/stdlib/SparseArrays/src/linalg.jl index c6852382b5406..0ac2806b77a04 100644 --- a/stdlib/SparseArrays/src/linalg.jl +++ b/stdlib/SparseArrays/src/linalg.jl @@ -646,7 +646,7 @@ function _ldiv!(L::LowerTriangularPlain, B::StridedVecOrMat) for k = 1:ncolB for j = 1:nrowB i1 = ia[j] - i2 = ia[j + 1] - 1 + i2 = ia[j + 1] - one(eltype(ia)) # find diagonal element ii = searchsortedfirst(ja, j, i1, i2, Base.Order.Forward) @@ -688,7 +688,7 @@ function _ldiv!(U::UpperTriangularPlain, B::StridedVecOrMat) for k = 1:ncolB for j = nrowB:-1:1 i1 = ia[j] - i2 = ia[j + 1] - 1 + i2 = ia[j + 1] - one(eltype(ia)) # find diagonal element ii = searchsortedlast(ja, j, i1, i2, Base.Order.Forward) diff --git a/stdlib/SparseArrays/test/sparsevector.jl b/stdlib/SparseArrays/test/sparsevector.jl index 602818678908b..79c952620050c 100644 --- a/stdlib/SparseArrays/test/sparsevector.jl +++ b/stdlib/SparseArrays/test/sparsevector.jl @@ -1050,6 +1050,10 @@ end @test y == Af'x2f end end + @testset "ldiv with different element types (#40171)" begin + sA = sparse(Int16.(1:4), Int16.(1:4), ones(4)) + @test all(ldiv!(LowerTriangular(sA), ones(4)) .≈ 1.) + end @testset "ldiv ops with triangular matrices and sparse vecs (#14005)" begin m = 10 sparsefloatvecs = SparseVector[sprand(m, 0.4) for k in 1:3]