From 94f66fc32e27bbbbf0ec4358629688923bed537a Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Wed, 26 Aug 2020 12:32:20 +0200 Subject: [PATCH] Fix #1974: assertion when reserving an empty sparse matrix --- Eigen/src/SparseCore/SparseMatrix.h | 3 ++- test/sparse_basic.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Eigen/src/SparseCore/SparseMatrix.h b/Eigen/src/SparseCore/SparseMatrix.h index 0a2490bcc..a5396538b 100644 --- a/Eigen/src/SparseCore/SparseMatrix.h +++ b/Eigen/src/SparseCore/SparseMatrix.h @@ -327,7 +327,8 @@ class SparseMatrix m_outerIndex[j] = newOuterIndex[j]; m_innerNonZeros[j] = innerNNZ; } - m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + reserveSizes[m_outerSize-1]; + if(m_outerSize>0) + m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + reserveSizes[m_outerSize-1]; m_data.resize(m_outerIndex[m_outerSize]); } diff --git a/test/sparse_basic.cpp b/test/sparse_basic.cpp index d0ef722b6..43318da79 100644 --- a/test/sparse_basic.cpp +++ b/test/sparse_basic.cpp @@ -612,6 +612,14 @@ template void sparse_basic(const SparseMatrixType& re iters[0] = IteratorType(m2,0); iters[1] = IteratorType(m2,m2.outerSize()-1); } + + // test reserve with empty rows/columns + { + SparseMatrixType m1(0,cols); + m1.reserve(ArrayXi::Constant(m1.outerSize(),1)); + SparseMatrixType m2(rows,0); + m2.reserve(ArrayXi::Constant(m2.outerSize(),1)); + } }