mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-25 23:06:10 +01:00
Make warnings in assertions fire for GCC/Clang again
The old code caused warnings to fire under MSVC, and Clang <3.8. I could not find a GCC version where it worked, but I assume that it did at some point. This new code causes all of MSVC, GCC, Clang, in current versions, to emit signed/unsigned comparison warning in test like this: ```cpp TEST_CASE() { int32_t i = -1; uint32_t j = 1; REQUIRE(i != j); } ``` Where previously only MSVC would emit the warning. Fixes #1880
This commit is contained in:
parent
38a0dfca6d
commit
60cfaa38fb
@ -56,6 +56,9 @@
|
|||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
|
# define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
|
||||||
_Pragma( "GCC diagnostic ignored \"-Wunused-variable\"" )
|
_Pragma( "GCC diagnostic ignored \"-Wunused-variable\"" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
@ -63,6 +66,9 @@
|
|||||||
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
||||||
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||||
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
||||||
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
||||||
@ -142,6 +148,8 @@
|
|||||||
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )
|
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )
|
||||||
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) )
|
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) )
|
||||||
|
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)sizeof(__VA_ARGS__)
|
||||||
|
|
||||||
# if _MSC_VER >= 1900 // Visual Studio 2015 or newer
|
# if _MSC_VER >= 1900 // Visual Studio 2015 or newer
|
||||||
# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
|
# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
|
||||||
# endif
|
# endif
|
||||||
@ -340,6 +348,11 @@
|
|||||||
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
|
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// The goal of this macro is to avoid evaluation of the arguments, but
|
||||||
|
// still have the compiler warn on problems inside...
|
||||||
|
#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
|
||||||
|
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
||||||
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
||||||
do { \
|
do { \
|
||||||
|
/* The expression should not be evaluated, but warnings should hopefully be checked */ \
|
||||||
|
CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \
|
||||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
|
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
|
||||||
INTERNAL_CATCH_TRY { \
|
INTERNAL_CATCH_TRY { \
|
||||||
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
||||||
@ -54,8 +56,7 @@
|
|||||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||||
} while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
|
} while( false )
|
||||||
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \
|
#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \
|
||||||
|
@ -300,7 +300,7 @@ TEST_CASE("analyse", "[approvals][benchmark]") {
|
|||||||
CHECK(analysis.outliers.low_severe == 0);
|
CHECK(analysis.outliers.low_severe == 0);
|
||||||
CHECK(analysis.outliers.high_mild == 0);
|
CHECK(analysis.outliers.high_mild == 0);
|
||||||
CHECK(analysis.outliers.high_severe == 0);
|
CHECK(analysis.outliers.high_severe == 0);
|
||||||
CHECK(analysis.outliers.samples_seen == samples.size());
|
CHECK(analysis.outliers.samples_seen == static_cast<int>(samples.size()));
|
||||||
|
|
||||||
CHECK(analysis.outlier_variance < 0.5);
|
CHECK(analysis.outlier_variance < 0.5);
|
||||||
CHECK(analysis.outlier_variance > 0);
|
CHECK(analysis.outlier_variance > 0);
|
||||||
|
@ -202,10 +202,19 @@ namespace { namespace CompilationTests {
|
|||||||
inline static void synchronizing_callback( void * ) { }
|
inline static void synchronizing_callback( void * ) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (_MSC_VER)
|
||||||
|
#pragma warning(push)
|
||||||
|
// The function pointer comparison below triggers warning because of
|
||||||
|
// calling conventions
|
||||||
|
#pragma warning(disable:4244)
|
||||||
|
#endif
|
||||||
TEST_CASE("#925: comparing function pointer to function address failed to compile", "[!nonportable]" ) {
|
TEST_CASE("#925: comparing function pointer to function address failed to compile", "[!nonportable]" ) {
|
||||||
TestClass test;
|
TestClass test;
|
||||||
REQUIRE(utility::synchronizing_callback != test.testMethod_uponComplete_arg);
|
REQUIRE(utility::synchronizing_callback != test.testMethod_uponComplete_arg);
|
||||||
}
|
}
|
||||||
|
#if defined (_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_CASE( "#1027: Bitfields can be captured" ) {
|
TEST_CASE( "#1027: Bitfields can be captured" ) {
|
||||||
struct Y {
|
struct Y {
|
||||||
|
Loading…
Reference in New Issue
Block a user