Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't access uninitialized indices in tril!/triu! for numeric arrays #52528

Merged
merged 9 commits into from
Jan 25, 2024
Prev Previous commit
Next Next commit
Merge branch 'master' into jishnub/triul
  • Loading branch information
jishnub committed Jan 4, 2024
commit 437732c2a1bcffcff083b3ed39d6263ea5494069
69 changes: 69 additions & 0 deletions stdlib/LinearAlgebra/test/triangular.jl
Original file line number Diff line number Diff line change
Expand Up @@ -925,4 +925,73 @@ end
end
end

@testset "custom axes" begin
SZA = SizedArrays.SizedArray{(2,2)}([1 2; 3 4])
for T in (UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular)
S = T(SZA)
r = SizedArrays.SOneTo(2)
@test axes(S) === (r,r)
end
end

@testset "arithmetic with an immutable parent" begin
F = FillArrays.Fill(2, (4,4))
for UT in (UnitUpperTriangular, UnitLowerTriangular)
U = UT(F)
@test -U == -Array(U)
end

F = FillArrays.Fill(3im, (4,4))
for U in (UnitUpperTriangular(F), UnitLowerTriangular(F))
@test imag(F) == imag(collect(F))
end
end

@testset "error paths" begin
A = zeros(1,1); B = zeros(2,2)
@testset "inplace mul scaling with incompatible sizes" begin
for T in (UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular)
@test_throws DimensionMismatch mul!(T(A), T(B), 3)
@test_throws DimensionMismatch mul!(T(A), 3, T(B))
end
end
@testset "copyto with incompatible sizes" begin
for T in (UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular)
@test_throws BoundsError copyto!(T(A), T(B))
end
end
end

@testset "arithmetic with partly uninitialized matrices" begin
@testset "$(typeof(A))" for A in (Matrix{BigFloat}(undef,2,2), Matrix{Complex{BigFloat}}(undef,2,2)')
A[1,1] = A[2,2] = A[2,1] = 4
B = Matrix{eltype(A)}(undef, size(A))
for MT in (LowerTriangular, UnitLowerTriangular)
L = MT(A)
B .= 0
copyto!(B, L)
@test L * 2 == 2 * L == 2B
@test L/2 == B/2
@test 2\L == 2\B
@test real(L) == real(B)
@test imag(L) == imag(B)
end
end

@testset "$(typeof(A))" for A in (Matrix{BigFloat}(undef,2,2), Matrix{Complex{BigFloat}}(undef,2,2)')
A[1,1] = A[2,2] = A[1,2] = 4
B = Matrix{eltype(A)}(undef, size(A))
for MT in (UpperTriangular, UnitUpperTriangular)
U = MT(A)
B .= 0
copyto!(B, U)
@test U * 2 == 2 * U == 2B
@test U/2 == B/2
@test 2\U == 2\B
@test real(U) == real(B)
@test imag(U) == imag(B)
end
end
end

end # module TestTriangular
You are viewing a condensed version of this merge commit. You can view the full changes here.