diff --git a/src/Corrade/Utility/Assert.h b/src/Corrade/Utility/Assert.h index a020acfcc..94fceb510 100644 --- a/src/Corrade/Utility/Assert.h +++ b/src/Corrade/Utility/Assert.h @@ -36,7 +36,6 @@ #include #include "Corrade/Utility/Debug.h" -#include "Corrade/Utility/Macros.h" /* CORRADE_LINE_STRING */ #elif !defined(NDEBUG) #include #endif @@ -408,10 +407,17 @@ You can override this implementation by placing your own #elif defined(CORRADE_STANDARD_ASSERT) #define CORRADE_INTERNAL_ASSERT(condition) assert(condition) #else +/* The __FILE__ is deliberately printed separately instead of joined with the + rest of the string literal to deduplicate it in the binary. As the full file + path is usually used by the buildsystem, it can get rather long, and the + savings from deduplicating significantly outweigh the extra code size, + especially in assertion-heavy code. OTOH the "Assertion" and "failed at" is + joined with the stringified condition, as they're relatively short and the + extra code size would likely be more than the savings. */ #define CORRADE_INTERNAL_ASSERT(condition) \ do { \ if(!(condition)) { \ - Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput()} << "Assertion " #condition " failed at " __FILE__ ":" CORRADE_LINE_STRING; \ + Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput(), Corrade::Utility::Debug::Flag::NoSpace} << "Assertion " #condition " failed at " << __FILE__ ":" << __LINE__; \ std::abort(); \ } \ } while(false) @@ -451,9 +457,10 @@ You can override this implementation by placing your own assert(!#condition); \ }(), 0)) #else +/* See CORRADE_INTERNAL_ASSERT() for why __FILE__ is printed separately */ #define CORRADE_INTERNAL_CONSTEXPR_ASSERT(condition) \ static_cast((condition) ? 0 : ([&]() { \ - Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput()} << "Assertion " #condition " failed at " __FILE__ ":" CORRADE_LINE_STRING; \ + Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput(), Corrade::Utility::Debug::Flag::NoSpace} << "Assertion " #condition " failed at " << __FILE__ ":" << __LINE__; \ std::abort(); \ }(), 0)) #endif @@ -485,10 +492,11 @@ You can override this implementation by placing your own #elif defined(CORRADE_STANDARD_ASSERT) #define CORRADE_INTERNAL_ASSERT_OUTPUT(call) assert(call) #else +/* See CORRADE_INTERNAL_ASSERT() for why __FILE__ is printed separately */ #define CORRADE_INTERNAL_ASSERT_OUTPUT(call) \ do { \ if(!(call)) { \ - Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput()} << "Assertion " #call " failed at " __FILE__ ":" CORRADE_LINE_STRING; \ + Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput(), Corrade::Utility::Debug::Flag::NoSpace} << "Assertion " #call " failed at " << __FILE__ ":" << __LINE__; \ std::abort(); \ } \ } while(false) @@ -503,9 +511,9 @@ namespace Corrade { namespace Utility { namespace Implementation { return Corrade::Utility::forward(value); } #else - template T assertExpression(T&& value, const char* message) { + template T assertExpression(T&& value, const char* message, const char* file, int line) { if(!value) { - Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput()} << message; + Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput(), Corrade::Utility::Debug::Flag::NoSpace} << message << file << line; std::abort(); } @@ -559,7 +567,8 @@ You can override this implementation by placing your own #elif defined(CORRADE_STANDARD_ASSERT) #define CORRADE_INTERNAL_ASSERT_EXPRESSION(...) Corrade::Utility::Implementation::assertExpression(__VA_ARGS__) #else -#define CORRADE_INTERNAL_ASSERT_EXPRESSION(...) Corrade::Utility::Implementation::assertExpression(__VA_ARGS__, "Assertion " #__VA_ARGS__ " failed at " __FILE__ ":" CORRADE_LINE_STRING) +/* See CORRADE_INTERNAL_ASSERT() for why __FILE__ is printed separately */ +#define CORRADE_INTERNAL_ASSERT_EXPRESSION(...) Corrade::Utility::Implementation::assertExpression(__VA_ARGS__, "Assertion " #__VA_ARGS__ " failed at ", __FILE__ ":", __LINE__) #endif #endif @@ -602,9 +611,10 @@ You can override this implementation by placing your own #elif defined(CORRADE_STANDARD_ASSERT) #define CORRADE_INTERNAL_ASSERT_UNREACHABLE() assert(!"unreachable code") #else +/* See CORRADE_INTERNAL_ASSERT() for why __FILE__ is printed separately */ #define CORRADE_INTERNAL_ASSERT_UNREACHABLE() \ do { \ - Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput()} << "Reached unreachable code at " __FILE__ ":" CORRADE_LINE_STRING; \ + Corrade::Utility::Error{Corrade::Utility::Error::defaultOutput(), Corrade::Utility::Debug::Flag::NoSpace} << "Reached unreachable code at " << __FILE__ ":" << __LINE__; \ std::abort(); \ } while(false) #endif