diff --git a/src/matmul.jl b/src/matmul.jl index 6eb9e9df..340458e7 100644 --- a/src/matmul.jl +++ b/src/matmul.jl @@ -932,7 +932,7 @@ function __generic_matvecmul!(f::F, C::AbstractVector, A::AbstractVecOrMat, B::A @inbounds begin if length(B) == 0 for k = eachindex(C) - @stable_muladdmul _modify!(MulAddMul(alpha,beta), false, C, k) + @stable_muladdmul _modify!(MulAddMul(alpha,beta), zero(eltype(C)), C, k) end else for k = eachindex(C) @@ -955,7 +955,7 @@ function __generic_matvecmul!(::typeof(identity), C::AbstractVector, A::Abstract if !iszero(beta) C[i] *= beta elseif length(B) == 0 - C[i] = false + C[i] = zero(eltype(C)) else C[i] = zero(A[i]*B[1] + A[i]*B[1]) end diff --git a/test/matmul.jl b/test/matmul.jl index 86c75ae5..938fc3b7 100644 --- a/test/matmul.jl +++ b/test/matmul.jl @@ -6,6 +6,11 @@ using Base: rtoldefault using Test, LinearAlgebra, Random using LinearAlgebra: mul!, Symmetric, Hermitian +const BASE_TEST_PATH = joinpath(Sys.BINDIR, "..", "share", "julia", "test") + +isdefined(Main, :SizedArrays) || @eval Main include(joinpath($(BASE_TEST_PATH), "testhelpers", "SizedArrays.jl")) +using .Main.SizedArrays + ## Test Julia fallbacks to BLAS routines mul_wrappers = [ @@ -1176,4 +1181,16 @@ end end end +@testset "zero-length generic matvec" begin + m = SizedArrays.SizedArray{(2,2)}(ones(2,2)) + A = fill(m, 2, 0) + v = fill(m, size(A,2)) + w = similar(v, size(A,1)) + mul!(w, A, v) + @test all(iszero, w) + A = fill(m, 0, 2) + mul!(w, A', v) + @test all(iszero, w) +end + end # module TestMatmul