From d46d726e9d06416c7d1d5a81bdeae04c629f93d8 Mon Sep 17 00:00:00 2001 From: Christoph Hertzberg Date: Mon, 13 Apr 2020 16:41:20 +0200 Subject: 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. --- Eigen/src/Core/CommaInitializer.h | 2 +- test/commainitializer.cpp | 26 +++++++++++++++++--------- 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& 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 +template struct test_block_recursion { static void run() { - test_blocks<(N>>6)&3, (N>>4)&3, (N>>2)&3, N & 3>(); - test_block_recursion::run(); + test_block_recursion::run(); + test_block_recursion::run(); } }; -template<> -struct test_block_recursion<-1> +template +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(); } -- cgit v1.2.3