diff --git a/base/sparse/cholmod.jl b/base/sparse/cholmod.jl index 4fffad126b291..b561dbdfed6c3 100644 --- a/base/sparse/cholmod.jl +++ b/base/sparse/cholmod.jl @@ -808,13 +808,15 @@ get_perm(FC::FactorComponent) = get_perm(Factor(FC)) ######################### # Convertion/construction -function convert{T<:VTypes}(::Type{Dense}, A::VecOrMat{T}) +function convert(::Type{Dense}, A::VecOrMat) + T = promote_type(eltype(A), Float64) d = allocate_dense(size(A, 1), size(A, 2), stride(A, 2), T) s = unsafe_load(d.p) - unsafe_copy!(s.x, pointer(A), length(A)) + for i in eachindex(A) + unsafe_store!(s.x, A[i], i) + end d end -convert(::Type{Dense}, A::VecOrMat) = Dense(float(A)) convert(::Type{Dense}, A::Sparse) = sparse_to_dense(A) # This constructior assumes zero based colptr and rowval diff --git a/test/sparsedir/cholmod.jl b/test/sparsedir/cholmod.jl index 97a5802d98980..706c655ece629 100644 --- a/test/sparsedir/cholmod.jl +++ b/test/sparsedir/cholmod.jl @@ -621,3 +621,7 @@ Fnew = deserialize(b) @test_throws ArgumentError diag(Fnew) @test_throws ArgumentError logdet(Fnew) +# Issue with promotion during conversion to CHOLMOD.Dense +@test SparseMatrix.CHOLMOD.Dense(ones(Float32, 5)) == ones(5, 1) +@test SparseMatrix.CHOLMOD.Dense(ones(Int, 5)) == ones(5, 1) +@test SparseMatrix.CHOLMOD.Dense(ones(Complex{Float32}, 5, 2)) == ones(5, 2)