diff options
author | Michael Catanzaro <mcatanzaro@igalia.com> | 2019-01-02 16:15:17 -0600 |
---|---|---|
committer | Michael Catanzaro <mcatanzaro@igalia.com> | 2019-01-15 15:57:44 -0600 |
commit | 4a0ce6b4589c3ced0fba37c7917038d27747192b (patch) | |
tree | 33a245fab6df08c03aae32c13d80bbd08f186246 /glib | |
parent | 6a372bf7036312bd59d2c5cf9bfcd034831b3b00 (diff) | |
download | glib-4a0ce6b4589c3ced0fba37c7917038d27747192b.tar.gz |
Add separate definitions of g_assert_[non]null() for C++
In C++ we can use nullptr to ensure g_assert_[non]null() is only called
with pointers. This will introduce build failures in tests that would
have previously compiled, but only in C++, and only for code that
misused these macros. Code using the macros properly will be fine.
This change caught a couple bugs in WebKit's API tests, where I had
accidentally used these functions improperly. E.g. this is now a build
failure in C++:
g_assert_null(webkit_context_menu_get_n_items(menu)); /* Oops! */
Either I wanted to use cmpuint there, or I wanted to use
webkit_context_menu_get_items() to receive a GList* instead.
Another example that will no longer build in C++:
g_assert_null(0); /* Contrived, but 0 is not a pointer! */
Diffstat (limited to 'glib')
-rw-r--r-- | glib/gtestutils.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/glib/gtestutils.h b/glib/gtestutils.h index 4aa6fa168..effc88237 100644 --- a/glib/gtestutils.h +++ b/glib/gtestutils.h @@ -124,6 +124,19 @@ typedef void (*GTestFixtureFunc) (gpointer fixture, g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ "'" #expr "' should be FALSE"); \ } G_STMT_END + +/* Use nullptr in C++ to catch misuse of these macros. */ +#if defined(__cplusplus) && __cplusplus >= 201100L +#define g_assert_null(expr) G_STMT_START { if G_LIKELY ((expr) == nullptr) ; else \ + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + "'" #expr "' should be nullptr"); \ + } G_STMT_END +#define g_assert_nonnull(expr) G_STMT_START { \ + if G_LIKELY ((expr) != nullptr) ; else \ + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + "'" #expr "' should not be nullptr"); \ + } G_STMT_END +#else /* not C++ */ #define g_assert_null(expr) G_STMT_START { if G_LIKELY ((expr) == NULL) ; else \ g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ "'" #expr "' should be NULL"); \ @@ -133,6 +146,8 @@ typedef void (*GTestFixtureFunc) (gpointer fixture, g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ "'" #expr "' should not be NULL"); \ } G_STMT_END +#endif + #ifdef G_DISABLE_ASSERT #define g_assert_not_reached() G_STMT_START { (void) 0; } G_STMT_END #define g_assert(expr) G_STMT_START { (void) 0; } G_STMT_END |