summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-03-22 11:34:53 +0000
committerArne Juul <arnej@verizonmedia.com>2021-03-22 12:56:02 +0000
commit8dfe34f9baa7ad7b89f4e07d5236a498050c0970 (patch)
treee9323271d5855abe8c255a73f5719c81d0fec044 /vespalib
parent9ce25b6088463aa7095b14010b34196adeb39e5b (diff)
slightly better REQUIRE_EQ messages
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/util/require.cpp14
-rw-r--r--vespalib/src/vespa/vespalib/util/require.h14
2 files changed, 20 insertions, 8 deletions
diff --git a/vespalib/src/vespa/vespalib/util/require.cpp b/vespalib/src/vespa/vespalib/util/require.cpp
index e762bb7ce06..170e37ef21f 100644
--- a/vespalib/src/vespa/vespalib/util/require.cpp
+++ b/vespalib/src/vespa/vespalib/util/require.cpp
@@ -8,15 +8,21 @@ namespace vespalib {
VESPA_IMPLEMENT_EXCEPTION(RequireFailedException, Exception);
-void handle_require_failure(const char *description, const char *file, uint32_t line)
+void throw_require_failed(const char *description, const char *file, uint32_t line)
{
asciistream msg;
- msg << file << ":" << line << ": ";
- msg << "error: (" << description << ") fails";
- std::cerr << msg.c_str() << "\n";
+ msg << "error: (" << description << ") failed";
asciistream loc;
loc << "file " << file << " line " << line;
throw RequireFailedException(msg.c_str(), loc.c_str(), 2);
}
+void handle_require_failure(const char *description, const char *file, uint32_t line)
+{
+ asciistream msg;
+ std::cerr << file << ":" << line << ": ";
+ std::cerr << "error: (" << description << ") failed\n";
+ throw_require_failed(description, file, line);
+}
+
} // namespace
diff --git a/vespalib/src/vespa/vespalib/util/require.h b/vespalib/src/vespa/vespalib/util/require.h
index a6b4af24820..ef3efd3d6e2 100644
--- a/vespalib/src/vespa/vespalib/util/require.h
+++ b/vespalib/src/vespa/vespalib/util/require.h
@@ -11,14 +11,19 @@ VESPA_DEFINE_EXCEPTION(RequireFailedException, Exception);
constexpr void handle_require_success() {}
+void throw_require_failed [[noreturn]] (const char *description, const char *file, uint32_t line);
+
void handle_require_failure [[noreturn]] (const char *description, const char *file, uint32_t line);
template<typename A, typename B>
-void handle_require_eq_failure [[noreturn]] (const A& a, const B& b,
+void handle_require_eq_failure [[noreturn]] (const A& a, const B& b, const char *a_desc, const char *b_desc,
const char *description, const char *file, uint32_t line)
{
- std::cerr << "( " << a << " == " << b << " ) is false\n";
- handle_require_failure(description, file, line);
+ std::cerr << file << ":" << line << ": error: ";
+ std::cerr << "expected (" << a_desc << " == " << b_desc << ")\n";
+ std::cerr << " lhs (" << a_desc << ") is: " << a << "\n";
+ std::cerr << " rhs (" << b_desc << ") is: " << b << "\n";
+ throw_require_failed(description, file, line);
}
#ifndef __STRING
@@ -32,7 +37,8 @@ void handle_require_eq_failure [[noreturn]] (const A& a, const B& b,
#define REQUIRE_EQ(a, b) \
(a == b) ? vespalib::handle_require_success() : \
- vespalib::handle_require_eq_failure(a, b, __STRING(a) " == " __STRING(b), \
+ vespalib::handle_require_eq_failure(a, b, __STRING(a), __STRING(b), \
+ __STRING(a) " == " __STRING(b), \
__FILE__, __LINE__)
} // namespace