From bd555a0b3ecd3e2279f956bd01b777aa5b269134 Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Wed, 19 Mar 2025 17:34:42 +0530 Subject: [PATCH] Avoid accessing unset indices in symmetric copyto! --- src/symmetric.jl | 4 ++-- test/symmetric.jl | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/symmetric.jl b/src/symmetric.jl index 6c06dec1..85d8aa98 100644 --- a/src/symmetric.jl +++ b/src/symmetric.jl @@ -352,7 +352,7 @@ function copyto!(dest::Symmetric, src::Symmetric) elseif src.uplo == dest.uplo copytrito!(dest.data, src.data, src.uplo) else - transpose!(dest.data, Base.unalias(dest.data, src.data)) + copytrito!(dest.data, transpose(Base.unalias(dest.data, src.data)), dest.uplo) end return dest end @@ -363,7 +363,7 @@ function copyto!(dest::Hermitian, src::Hermitian) elseif src.uplo == dest.uplo copytrito!(dest.data, src.data, src.uplo) else - adjoint!(dest.data, Base.unalias(dest.data, src.data)) + copytrito!(dest.data, adjoint(Base.unalias(dest.data, src.data)), dest.uplo) end return dest end diff --git a/test/symmetric.jl b/test/symmetric.jl index 68f0ff47..f653f4b9 100644 --- a/test/symmetric.jl +++ b/test/symmetric.jl @@ -1163,4 +1163,19 @@ end end end +@testset "copyto! with mismatched uplo" begin + for (S,tf) in ((Symmetric, transpose), (Hermitian, adjoint)) + for (uplo1,uplo2) in [(:U,:L), (:L, :U)] + M = Matrix{Complex{BigFloat}}(undef, 2, 2) + M[1,1] = M[2,2] = 3 + isupper = uplo1 == :U + M[1+!isupper, 1+isupper] = 4+3im + H1 = S(M, uplo1) + H2 = 2 * S(tf(M), uplo2) + copyto!(H2, H1) + @test H2 == H1 + end + end +end + end # module TestSymmetric