When compiling our codebase with clang we were getting the following
error:
GSL/tests/algorithm_tests.cpp:198:58: warning: catch handler catches by
value; should catch by reference instead
[misc-throw-by-value-catch-by-reference]
CHECK_THROWS_AS(copy(src_span_dyn, dst_span_static), fail_fast);
^
Looking at the catch source code exceptions were being caught by value.
One could have it designed so that users might say:
CHECK_THROWS_AS(copy(src_span_dyn, dst_span_static), fail_fast&);
But I don't think this is the intent and looking at the Catch tests
itself looks like this macro does not expect the reference:
REQUIRE_THROWS_AS( thisThrows(), std::domain_error );
CHECK_THROWS_AS( thisDoesntThrow(), std::domain_error );
This commit makes Catch catch exceptions by reference instead of by
value.
1. Use it to conditionally define CATCH_INTERNAL_CONFIG_COUNTER, not
CATCH_CONFIG_COUNTER, as __JETBRAINS_IDE__ is similar to
compiler-provided macros, not to user-provided ones.
2. Since __COUNTER__ will work starting with CLion 2017.3, use it
when possible (and hopefully remove this check altogether
at some point).
This also introduces Catch::clog() method to allow embedded targets
to override std::clog usage with their own stream (presumably null-sink),
similarly to how Catch::cout() and Catch::cerr() are used.
Fixes#989
This is not thread safe, but I think that was already true of Catch.
The construction/destruction of the std::ostringstream is where the
vast majority of time is spent per assertion. A simple test of
100000000 CHECK()s is reduced from around 60s to 7.4s
By using char const * instead of std::string we avoid significant
copying per assertion. In a simple loop with 10000000 CHECKS on
my system, this reduces the run time from 9.8s to 6s.
This prevents Catch from disabling `Wpadded` for Clang inside test files
(files that do not define either `CATCH_CONFIG_MAIN` or
`CATCH_CONFIG_RUNNER`).
catch_suppress_warnings.h and catch_reenable_warnings.h should be
included only once*, so that the stitching script includes them as the
first and last header respectively, since it only includes each header
once. This caused a bug, where the first one was included properly, but
the second one was included prematurely, from catch_xmlwriter.hpp, and
thus was guarded by `CATCH_IMPL`.
* At least until the stitching script is changed to accomodate common
warning disabling header.
Fixes#871
Types which are truthy, but have more information than the truthiness in their string conversion were showing up as 'true' or 'false' instead of showing the underlying type's string value.
Previously, this would not print out any messages for the last CHECK
```cpp
TEST_CASE("Foo") {
INFO("Test case start");
for (int i = 0; i < 2; ++i) {
INFO("The number is " << i);
CHECK(i == 0);
}
CHECK(false);
}
```
now it does.