aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Christoph Hertzberg <chtz@informatik.uni-bremen.de>2020-04-13 16:41:20 +0200
committerGravatar Christoph Hertzberg <chtz@informatik.uni-bremen.de>2020-04-13 16:41:20 +0200
commitd46d726e9d06416c7d1d5a81bdeae04c629f93d8 (patch)
tree8ec04276f6ef722dfd7b5f3baceba54af85e3fad
parentc854e189e6d4868fedc7d4ef81cc3485f5b24841 (diff)
CommaInitializer wrongfully asserted for 0-sized blocks
commainitialier unit-test never actually called `test_block_recursion`, which also was not correctly implemented and would have caused too deep template recursion.
-rw-r--r--Eigen/src/Core/CommaInitializer.h2
-rw-r--r--test/commainitializer.cpp26
2 files changed, 18 insertions, 10 deletions
diff --git a/Eigen/src/Core/CommaInitializer.h b/Eigen/src/Core/CommaInitializer.h
index 53066c653..c0e29c75c 100644
--- a/Eigen/src/Core/CommaInitializer.h
+++ b/Eigen/src/Core/CommaInitializer.h
@@ -43,7 +43,7 @@ struct CommaInitializer
inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)
: m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())
{
- eigen_assert(m_xpr.rows() > 0 && m_xpr.cols() > 0
+ eigen_assert(m_xpr.rows() >= other.rows() && m_xpr.cols() >= other.cols()
&& "Cannot comma-initialize a 0x0 matrix (operator<<)");
m_xpr.block(0, 0, other.rows(), other.cols()) = other;
}
diff --git a/test/commainitializer.cpp b/test/commainitializer.cpp
index 3cb94da62..f535117d5 100644
--- a/test/commainitializer.cpp
+++ b/test/commainitializer.cpp
@@ -34,8 +34,14 @@ void test_blocks()
if(N1 > 0)
{
- VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat11, mat21, mat22));
- VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat21, mat21, mat22));
+ if(M1 > 0)
+ {
+ VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat11, mat21, mat22));
+ }
+ if(M2 > 0)
+ {
+ VERIFY_RAISES_ASSERT((m_fixed << mat11, mat12, mat21, mat21, mat22));
+ }
}
else
{
@@ -49,20 +55,22 @@ void test_blocks()
}
-template<int N>
+template<int depth, int N=0>
struct test_block_recursion
{
static void run()
{
- test_blocks<(N>>6)&3, (N>>4)&3, (N>>2)&3, N & 3>();
- test_block_recursion<N-1>::run();
+ test_block_recursion<depth-1, N>::run();
+ test_block_recursion<depth-1, N + (1 << (depth-1))>::run();
}
};
-template<>
-struct test_block_recursion<-1>
+template<int N>
+struct test_block_recursion<0,N>
{
- static void run() { }
+ static void run() {
+ test_blocks<(N>>6)&3, (N>>4)&3, (N>>2)&3, N & 3>();
+ }
};
EIGEN_DECLARE_TEST(commainitializer)
@@ -102,5 +110,5 @@ EIGEN_DECLARE_TEST(commainitializer)
// recursively test all block-sizes from 0 to 3:
- test_block_recursion<(1<<8) - 1>();
+ test_block_recursion<8>::run();
}