diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8e8ee02d..82cc8236 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,7 +14,7 @@ if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
endif()
-project(Catch2 LANGUAGES CXX VERSION 2.12.1)
+project(Catch2 LANGUAGES CXX VERSION 2.12.2)
# Provide path for scripts
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
diff --git a/README.md b/README.md
index 455b572e..c509df6f 100644
--- a/README.md
+++ b/README.md
@@ -5,11 +5,11 @@
[](https://travis-ci.org/catchorg/Catch2)
[](https://ci.appveyor.com/project/catchorg/catch2)
[](https://codecov.io/gh/catchorg/Catch2)
-[](https://wandbox.org/permlink/DQL97fLLJLZXwB8d)
+[](https://wandbox.org/permlink/QdDfqVqDGRuwcduN)
[](https://discord.gg/4CWS9zD)
-The latest version of the single header can be downloaded directly using this link
+The latest version of the single header can be downloaded directly using this link
## Catch2 is released!
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 1567314d..d4ac966a 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -2,6 +2,7 @@
# Release notes
**Contents**
+[2.12.2](#2122)
[2.12.1](#2121)
[2.12.0](#2120)
[2.11.3](#2113)
@@ -36,6 +37,20 @@
[Older versions](#older-versions)
[Even Older versions](#even-older-versions)
+
+## 2.12.2
+
+### Fixes
+* Fixed compilation failure if `is_range` ADL found deleted function (#1929)
+* Fixed potential UB in `CAPTURE` if the expression contained non-ASCII characters (#1925)
+
+### Improvements
+* `std::result_of` is not used if `std::invoke_result` is available (#1934)
+* JUnit reporter writes out `status` attribute for tests (#1899)
+* Suppresed clang-tidy's `hicpp-vararg` warning (#1921)
+ * Catch2 was already suppressing the `cppcoreguidelines-pro-type-vararg` alias of the warning
+
+
## 2.12.1
### Fixes
diff --git a/include/catch.hpp b/include/catch.hpp
index b8b79b94..015a304c 100644
--- a/include/catch.hpp
+++ b/include/catch.hpp
@@ -11,7 +11,7 @@
#define CATCH_VERSION_MAJOR 2
#define CATCH_VERSION_MINOR 12
-#define CATCH_VERSION_PATCH 1
+#define CATCH_VERSION_PATCH 2
#ifdef __clang__
# pragma clang system_header
diff --git a/include/internal/catch_version.cpp b/include/internal/catch_version.cpp
index 8f2daea7..ad92f57c 100644
--- a/include/internal/catch_version.cpp
+++ b/include/internal/catch_version.cpp
@@ -37,7 +37,7 @@ namespace Catch {
}
Version const& libraryVersion() {
- static Version version( 2, 12, 1, "", 0 );
+ static Version version( 2, 12, 2, "", 0 );
return version;
}
diff --git a/single_include/catch2/catch.hpp b/single_include/catch2/catch.hpp
index 6beb0ead..f64422ae 100644
--- a/single_include/catch2/catch.hpp
+++ b/single_include/catch2/catch.hpp
@@ -1,6 +1,6 @@
/*
- * Catch v2.12.1
- * Generated: 2020-04-21 19:29:20.964532
+ * Catch v2.12.2
+ * Generated: 2020-05-25 15:09:23.791719
* ----------------------------------------------------------
* This file has been merged from multiple headers. Please don't edit it directly
* Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved.
@@ -15,7 +15,7 @@
#define CATCH_VERSION_MAJOR 2
#define CATCH_VERSION_MINOR 12
-#define CATCH_VERSION_PATCH 1
+#define CATCH_VERSION_PATCH 2
#ifdef __clang__
# pragma clang system_header
@@ -163,7 +163,7 @@ namespace Catch {
//
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
# if !defined(__ibmxl__)
-# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg) */
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
# endif
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
@@ -944,13 +944,13 @@ namespace Catch {
#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
// std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
- // replaced with std::invoke_result here. Also *_t format is preferred over
- // typename *::type format.
- template
- using FunctionReturnType = std::remove_reference_t>>;
+ // replaced with std::invoke_result here.
+ template
+ using FunctionReturnType = std::remove_reference_t>>;
#else
- template
- using FunctionReturnType = typename std::remove_reference::type>::type>::type;
+ // Keep ::type here because we still support C++11
+ template
+ using FunctionReturnType = typename std::remove_reference::type>::type>::type;
#endif
} // namespace Catch
@@ -1988,20 +1988,27 @@ namespace Catch {
#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
namespace Catch {
- struct not_this_one {}; // Tag type for detecting which begin/ end are being selected
-
- // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace
+ // Import begin/ end from std here
using std::begin;
using std::end;
- not_this_one begin( ... );
- not_this_one end( ... );
+ namespace detail {
+ template
+ struct void_type {
+ using type = void;
+ };
+
+ template
+ struct is_range_impl : std::false_type {
+ };
+
+ template
+ struct is_range_impl()))>::type> : std::true_type {
+ };
+ } // namespace detail
template
- struct is_range {
- static const bool value =
- !std::is_same())), not_this_one>::value &&
- !std::is_same())), not_this_one>::value;
+ struct is_range : detail::is_range_impl {
};
#if defined(_MANAGED) // Managed types are never ranges
@@ -3714,8 +3721,6 @@ namespace Matchers {
struct UnorderedEqualsMatcher : MatcherBase> {
UnorderedEqualsMatcher(std::vector const& target) : m_target(target) {}
bool match(std::vector const& vec) const override {
- // Note: This is a reimplementation of std::is_permutation,
- // because I don't want to include inside the common path
if (m_target.size() != vec.size()) {
return false;
}
@@ -6552,20 +6557,18 @@ namespace Catch {
return {};
}
};
- template
- using ResultOf_t = typename std::result_of::type;
// invoke and not return void :(
template
- CompleteType_t> complete_invoke(Fun&& fun, Args&&... args) {
- return CompleteInvoker>::invoke(std::forward(fun), std::forward(args)...);
+ CompleteType_t> complete_invoke(Fun&& fun, Args&&... args) {
+ return CompleteInvoker>::invoke(std::forward(fun), std::forward(args)...);
}
const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
} // namespace Detail
template
- Detail::CompleteType_t> user_code(Fun&& fun) {
+ Detail::CompleteType_t> user_code(Fun&& fun) {
CATCH_TRY{
return Detail::complete_invoke(std::forward(fun));
} CATCH_CATCH_ALL{
@@ -6810,8 +6813,8 @@ namespace Catch {
Result result;
int iterations;
};
- template
- using TimingOf = Timing, Detail::CompleteType_t>>;
+ template
+ using TimingOf = Timing, Detail::CompleteType_t>>;
} // namespace Benchmark
} // namespace Catch
@@ -6822,7 +6825,7 @@ namespace Catch {
namespace Benchmark {
namespace Detail {
template
- TimingOf measure(Fun&& fun, Args&&... args) {
+ TimingOf measure(Fun&& fun, Args&&... args) {
auto start = Clock::now();
auto&& r = Detail::complete_invoke(fun, std::forward(args)...);
auto end = Clock::now();
@@ -6841,11 +6844,11 @@ namespace Catch {
namespace Benchmark {
namespace Detail {
template
- TimingOf measure_one(Fun&& fun, int iters, std::false_type) {
+ TimingOf measure_one(Fun&& fun, int iters, std::false_type) {
return Detail::measure(fun, iters);
}
template
- TimingOf measure_one(Fun&& fun, int iters, std::true_type) {
+ TimingOf measure_one(Fun&& fun, int iters, std::true_type) {
Detail::ChronometerModel meter;
auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));
@@ -6862,7 +6865,7 @@ namespace Catch {
};
template
- TimingOf)> run_for_at_least(ClockDuration how_long, int seed, Fun&& fun) {
+ TimingOf> run_for_at_least(ClockDuration how_long, int seed, Fun&& fun) {
auto iters = seed;
while (iters < (1 << 30)) {
auto&& Timing = measure_one(fun, iters, is_callable());
@@ -11768,10 +11771,10 @@ namespace Catch {
Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {
auto trimmed = [&] (size_t start, size_t end) {
- while (names[start] == ',' || isspace(names[start])) {
+ while (names[start] == ',' || isspace(static_cast(names[start]))) {
++start;
}
- while (names[end] == ',' || isspace(names[end])) {
+ while (names[end] == ',' || isspace(static_cast(names[end]))) {
--end;
}
return names.substr(start, end - start + 1);
@@ -15159,7 +15162,7 @@ namespace Catch {
}
Version const& libraryVersion() {
- static Version version( 2, 12, 1, "", 0 );
+ static Version version( 2, 12, 2, "", 0 );
return version;
}
@@ -16738,6 +16741,11 @@ namespace Catch {
xml.writeAttribute( "name", name );
}
xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) );
+ // This is not ideal, but it should be enough to mimic gtest's
+ // junit output.
+ // Ideally the JUnit reporter would also handle `skipTest`
+ // events and write those out appropriately.
+ xml.writeAttribute( "status", "run" );
writeAssertions( sectionNode );