diff options
-rw-r--r-- | Eigen/Core | 6 | ||||
-rw-r--r-- | Eigen/src/Core/util/Macros.h | 111 | ||||
-rw-r--r-- | test/main.h | 15 |
3 files changed, 89 insertions, 43 deletions
diff --git a/Eigen/Core b/Eigen/Core index 8567e294c..29b3a2ac1 100644 --- a/Eigen/Core +++ b/Eigen/Core @@ -156,9 +156,13 @@ // for min/max: #include <algorithm> +#if !EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO +#include <iostream> // for custom assert implementation +#endif + // for outputting debug info #ifdef EIGEN_DEBUG_ASSIGN -#include<iostream> +#include <iostream> #endif // required for __cpuid, needs to be included after cmath diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 6a30f6bed..020cf2cb7 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -34,10 +34,23 @@ (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \ EIGEN_MINOR_VERSION>=z)))) #ifdef __GNUC__ - #define EIGEN_GNUC_AT_LEAST(x,y) ((__GNUC__>=x && __GNUC_MINOR__>=y) || __GNUC__>x) + #define EIGEN_GNUC_AT_LEAST(x,y) ((__GNUC__==x && __GNUC_MINOR__>=y) || __GNUC__>x) #else #define EIGEN_GNUC_AT_LEAST(x,y) 0 #endif + +#ifdef __GNUC__ + #define EIGEN_GNUC_AT_MOST(x,y) ((__GNUC__==x && __GNUC_MINOR__<=y) || __GNUC__<x) +#else + #define EIGEN_GNUC_AT_MOST(x,y) 0 +#endif + +#if EIGEN_GNUC_AT_MOST(4,3) + // see bug 89 + #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 0 +#else + #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 1 +#endif #if defined(__GNUC__) && (__GNUC__ <= 3) #define EIGEN_GCC3_OR_OLDER 1 @@ -109,31 +122,13 @@ #define EIGEN_DEBUG_VAR(x) std::cerr << #x << " = " << x << std::endl; -#ifdef NDEBUG -# ifndef EIGEN_NO_DEBUG -# define EIGEN_NO_DEBUG -# endif -#endif - -#ifndef eigen_assert -#ifdef EIGEN_NO_DEBUG -#define eigen_assert(x) -#else -#define eigen_assert(x) assert(x) -#endif -#endif - -#ifdef EIGEN_INTERNAL_DEBUGGING -#define eigen_internal_assert(x) eigen_assert(x) -#else -#define eigen_internal_assert(x) -#endif +// concatenate two tokens +#define EIGEN_CAT2(a,b) a ## b +#define EIGEN_CAT(a,b) EIGEN_CAT2(a,b) -#ifdef EIGEN_NO_DEBUG -#define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x -#else -#define EIGEN_ONLY_USED_FOR_DEBUG(x) -#endif +// convert a token to a string +#define EIGEN_MAKESTRING2(a) #a +#define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a) // EIGEN_ALWAYS_INLINE_ATTRIB should be use in the declaration of function // which should be inlined even in debug mode. @@ -175,6 +170,64 @@ #define EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS #define EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS inline +#ifdef NDEBUG +# ifndef EIGEN_NO_DEBUG +# define EIGEN_NO_DEBUG +# endif +#endif + +// eigen_plain_assert is where we implement the workaround for the assert() bug in GCC <= 4.3, see bug 89 +#ifdef EIGEN_NO_DEBUG + #define eigen_plain_assert(x) +#else + #if EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO + namespace Eigen { + namespace internal { + inline bool copy_bool(bool b) { return b; } + } + } + #define eigen_plain_assert(x) assert(x) + #else + // work around bug 89 + namespace Eigen { + namespace internal { + // trivial function copying a bool. Must be EIGEN_DONT_INLINE, so we implement it after including Eigen headers. + // see bug 89. + namespace { + EIGEN_DONT_INLINE bool copy_bool(bool b) { return b; } + } + inline void assert_fail(const char *condition, const char *function, const char *file, int line) + { + std::cerr << "assertion failed: " << condition << " in function " << function << " at " << file << ":" << line << std::endl; + abort(); + } + } + } + #define eigen_plain_assert(x) \ + do { \ + if(!Eigen::internal::copy_bool(x)) \ + Eigen::internal::assert_fail(EIGEN_MAKESTRING(x), __PRETTY_FUNCTION__, __FILE__, __LINE__); \ + } while(false) + #endif +#endif + +// eigen_assert can be overridden +#ifndef eigen_assert +#define eigen_assert(x) eigen_plain_assert(x) +#endif + +#ifdef EIGEN_INTERNAL_DEBUGGING +#define eigen_internal_assert(x) eigen_assert(x) +#else +#define eigen_internal_assert(x) +#endif + +#ifdef EIGEN_NO_DEBUG +#define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x +#else +#define EIGEN_ONLY_USED_FOR_DEBUG(x) +#endif + #if (defined __GNUC__) #define EIGEN_DEPRECATED __attribute__((deprecated)) #elif (defined _MSC_VER) @@ -244,14 +297,6 @@ // just an empty macro ! #define EIGEN_EMPTY -// concatenate two tokens -#define EIGEN_CAT2(a,b) a ## b -#define EIGEN_CAT(a,b) EIGEN_CAT2(a,b) - -// convert a token to a string -#define EIGEN_MAKESTRING2(a) #a -#define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a) - #if defined(_MSC_VER) && (!defined(__INTEL_COMPILER)) #define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \ using Base::operator =; diff --git a/test/main.h b/test/main.h index 461c2500d..378edc5ed 100644 --- a/test/main.h +++ b/test/main.h @@ -77,7 +77,6 @@ namespace Eigen ~eigen_assert_exception() { Eigen::no_more_assert = false; } }; } - // If EIGEN_DEBUG_ASSERTS is defined and if no assertion is triggered while // one should have been, then the list of excecuted assertions is printed out. // @@ -91,11 +90,10 @@ namespace Eigen { namespace internal { - static bool push_assert = false; + static bool push_assert = false; } static std::vector<std::string> eigen_assert_list; } - #define eigen_assert(a) \ if( (!(a)) && (!no_more_assert) ) \ { \ @@ -129,17 +127,16 @@ namespace Eigen } #else // EIGEN_DEBUG_ASSERTS - + // see bug 89. The copy_bool here is working around a bug in gcc <= 4.3 #define eigen_assert(a) \ - if( (!(a)) && (!no_more_assert) ) \ + if( (!Eigen::internal::copy_bool(a)) && (!no_more_assert) )\ { \ Eigen::no_more_assert = true; \ if(report_on_cerr_on_assert_failure) \ - assert(a); \ + eigen_plain_assert(a); \ else \ throw Eigen::eigen_assert_exception(); \ } - #define VERIFY_RAISES_ASSERT(a) { \ Eigen::no_more_assert = false; \ Eigen::report_on_cerr_on_assert_failure = false; \ @@ -165,7 +162,6 @@ namespace Eigen #define EIGEN_INTERNAL_DEBUGGING #include <Eigen/QR> // required for createRandomPIMatrixOfRank - static void verify_impl(bool condition, const char *testname, const char *file, int line, const char *condition_as_string) { if (!condition) @@ -176,7 +172,8 @@ static void verify_impl(bool condition, const char *testname, const char *file, } } -#define VERIFY(a) verify_impl(a, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a)) +#define VERIFY(a) assert(a) +//#define VERIFY(a) verify_impl(a, g_test_stack.back().c_str(), __FILE__, __LINE__, EI_PP_MAKE_STRING(a)) #define VERIFY_IS_EQUAL(a, b) VERIFY(test_is_equal(a, b)) #define VERIFY_IS_APPROX(a, b) VERIFY(test_isApprox(a, b)) |