base: Enable non-copiable types in gem5_assert message formatting
Previous implementation was taking string formatting arguments by value, which requires copiability or movability. Took the oportunity to scope the helper functions inside the macro using lambdas. Change-Id: I2cefc18df1e99b70e60e64588df61eb72a3e5166 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/67335 Tested-by: kokoro <noreply+kokoro@google.com> Maintainer: Bobby Bruce <bbruce@ucdavis.edu> Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
This commit is contained in:
committed by
Gabriel B.
parent
a0f6f85ad1
commit
cd2f8b3e6f
@@ -43,7 +43,6 @@
|
||||
|
||||
#include <cassert>
|
||||
#include <sstream>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
|
||||
#include "base/compiler.hh"
|
||||
@@ -289,24 +288,10 @@ class Logger
|
||||
#define NDEBUG_DEFINED 0
|
||||
#endif
|
||||
|
||||
template <typename ...Args>
|
||||
inline std::string
|
||||
_assertMsg(const std::string &format, Args... args)
|
||||
{
|
||||
return std::string(": ") + csprintf(format, args...);
|
||||
}
|
||||
|
||||
inline const char *
|
||||
_assertMsg()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* The assert macro will function like a normal assert, but will use panic
|
||||
* instead of straight abort(). This allows to perform some cleaning up in
|
||||
* ExitLogger::exit() before calling abort(). This macro will not check its
|
||||
* condition in fast builds, but it must still be valid code.
|
||||
* ExitLogger::exit() before calling abort().
|
||||
*
|
||||
* @param cond Condition that is checked; if false -> panic
|
||||
* @param ... Printf-based format string with arguments, extends printout.
|
||||
@@ -315,11 +300,17 @@ _assertMsg()
|
||||
*
|
||||
* @ingroup api_logger
|
||||
*/
|
||||
#define gem5_assert(cond, ...) \
|
||||
do { \
|
||||
if (GEM5_UNLIKELY(!NDEBUG_DEFINED && !static_cast<bool>(cond))) { \
|
||||
panic("assert(" #cond ") failed%s", _assertMsg(__VA_ARGS__)); \
|
||||
} \
|
||||
#define gem5_assert(cond, ...) \
|
||||
do { \
|
||||
GEM5_UNLIKELY(NDEBUG_DEFINED || static_cast<bool>(cond)) ? \
|
||||
void(0) : \
|
||||
[](const auto&... args) { \
|
||||
auto msg = [&]{ \
|
||||
if constexpr (sizeof...(args) == 0) return ""; \
|
||||
else return std::string(": ") + csprintf(args...); \
|
||||
}; \
|
||||
panic("assert(" #cond ") failed%s", msg()); \
|
||||
}(__VA_ARGS__); \
|
||||
} while (0)
|
||||
/** @} */ // end of api_logger
|
||||
|
||||
|
||||
@@ -553,6 +553,9 @@ TEST(LoggingDeathTest, gem5Assert)
|
||||
gem5_assert(true, "message\n");
|
||||
ASSERT_DEATH(gem5_assert(false, "message\n"), ::testing::HasSubstr(
|
||||
"panic: assert(false) failed: message\nMemory Usage:"));
|
||||
ASSERT_DEATH(gem5_assert(false, "%s, %s!\n", "Hello", "World"),
|
||||
::testing::HasSubstr(
|
||||
"panic: assert(false) failed: Hello, World!\nMemory Usage:"));
|
||||
gem5_assert(true);
|
||||
ASSERT_DEATH(gem5_assert(false), ::testing::HasSubstr(
|
||||
"panic: assert(false) failed\nMemory Usage:"));
|
||||
|
||||
Reference in New Issue
Block a user