diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8aa47635..dca4c7bf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -6,7 +6,7 @@ if(NOT DEFINED PROJECT_NAME)
set(NOT_SUBPROJECT ON)
endif()
-project(Catch2 LANGUAGES CXX VERSION 2.1.1)
+project(Catch2 LANGUAGES CXX VERSION 2.1.2)
include(GNUInstallDirs)
diff --git a/README.md b/README.md
index 1c2c03b0..fa2dba5c 100644
--- a/README.md
+++ b/README.md
@@ -5,9 +5,9 @@
[![Build Status](https://travis-ci.org/catchorg/Catch2.svg?branch=master)](https://travis-ci.org/catchorg/Catch2)
[![Build status](https://ci.appveyor.com/api/projects/status/github/catchorg/Catch2?svg=true)](https://ci.appveyor.com/project/catchorg/catch2)
[![codecov](https://codecov.io/gh/catchorg/Catch2/branch/master/graph/badge.svg)](https://codecov.io/gh/catchorg/Catch2)
-[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/TpIcJaLaH4WrKlhS)
+[![Try online](https://img.shields.io/badge/try-online-blue.svg)](https://wandbox.org/permlink/6O2wo5BOvVeUeKQe)
-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/conanfile.py b/conanfile.py
index fa9fdce1..ea66ccb1 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -4,7 +4,7 @@ from conans import ConanFile
class CatchConan(ConanFile):
name = "Catch"
- version = "2.1.1"
+ version = "2.1.2"
description = "A modern, C++-native, header-only, framework for unit-tests, TDD and BDD"
author = "philsquared"
generators = "cmake"
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 565d6cd8..76d88be7 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,5 +1,22 @@
+# 2.1.2
+
+## Fixes
+* Fixed compilation error with `-fno-rtti` (#1165)
+* Fixed NoAssertion warnings
+* `operator<<` is used before range-based stringification (#1172)
+* Fixed `-Wpedantic` warnings (extra semicolons and binary literals) (#1173)
+
+
+## Improvements
+* Added `CATCH_VERSION_{MAJOR,MINOR,PATCH}` macros (#1131)
+* Added `BrightYellow` colour for use in reporters (#979)
+ * It is also used by ConsoleReporter for reconstructed expressions
+
+## Other changes
+* Catch is now exported as a CMake package and linkable target (#1170)
+
# 2.1.1
## Improvements
diff --git a/include/catch.hpp b/include/catch.hpp
index 0a4711be..a6f8d3ba 100644
--- a/include/catch.hpp
+++ b/include/catch.hpp
@@ -11,7 +11,7 @@
#define CATCH_VERSION_MAJOR 2
#define CATCH_VERSION_MINOR 1
-#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 fc196d91..ab50285a 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, 1, 1, "", 0 );
+ static Version version( 2, 1, 2, "", 0 );
return version;
}
diff --git a/single_include/catch.hpp b/single_include/catch.hpp
index 160bad07..882699ea 100644
--- a/single_include/catch.hpp
+++ b/single_include/catch.hpp
@@ -1,6 +1,6 @@
/*
- * Catch v2.1.1
- * Generated: 2018-01-26 16:04:07.190063
+ * Catch v2.1.2
+ * Generated: 2018-02-09 17:05:21.506253
* ----------------------------------------------------------
* This file has been merged from multiple headers. Please don't edit it directly
* Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved.
@@ -13,6 +13,10 @@
// start catch.hpp
+#define CATCH_VERSION_MAJOR 2
+#define CATCH_VERSION_MINOR 1
+#define CATCH_VERSION_PATCH 2
+
#ifdef __clang__
# pragma clang system_header
#elif defined __GNUC__
@@ -116,6 +120,14 @@ namespace Catch {
# define CATCH_CPP14_OR_GREATER
# endif
+# if __cplusplus >= 201703L
+# define CATCH_CPP17_OR_GREATER
+# endif
+
+#endif
+
+#if defined(CATCH_CPP17_OR_GREATER)
+# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
#endif
#ifdef __clang__
@@ -164,6 +176,10 @@ namespace Catch {
// Visual C++
#ifdef _MSC_VER
+# if _MSC_VER >= 1900 // Visual Studio 2015 or newer
+# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+# endif
+
// Universal Windows platform does not support SEH
// Or console colours (or console at all...)
# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
@@ -196,6 +212,10 @@ namespace Catch {
# define CATCH_CONFIG_POSIX_SIGNALS
#endif
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_INTERNAL_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+#endif
+
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS
@@ -735,11 +755,11 @@ namespace Catch {
template
typename std::enable_if::value, std::string>::type convertUnstreamable( T const& ) {
return Detail::unprintableString;
- };
+ }
template
typename std::enable_if::value, std::string>::type convertUnstreamable( T const& value ) {
return convertUnknownEnumToString( value );
- };
+ }
} // namespace Detail
@@ -1057,7 +1077,7 @@ namespace Catch {
}
template
- struct StringMaker::value && !std::is_array::value>::type> {
+ struct StringMaker::value && !::Catch::Detail::IsStreamInsertable::value>::type> {
static std::string convert( R const& range ) {
return rangeToString( range );
}
@@ -1264,7 +1284,7 @@ namespace Catch {
// Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int)
template
- auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast(lhs == rhs); };
+ auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast(lhs == rhs); }
template
auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast( rhs ); }
template
@@ -1275,7 +1295,7 @@ namespace Catch {
auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast( lhs ) == rhs; }
template
- auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast(lhs != rhs); };
+ auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast(lhs != rhs); }
template
auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast( rhs ); }
template
@@ -3881,10 +3901,11 @@ namespace Catch {
BrightGreen = Bright | Green,
LightGrey = Bright | Grey,
BrightWhite = Bright | White,
+ BrightYellow = Bright | Yellow,
// By intention
FileName = LightGrey,
- Warning = Yellow,
+ Warning = BrightYellow,
ResultError = BrightRed,
ResultSuccess = BrightGreen,
ResultExpectedFailure = Warning,
@@ -3893,7 +3914,7 @@ namespace Catch {
Success = Green,
OriginalExpression = Cyan,
- ReconstructedExpression = Yellow,
+ ReconstructedExpression = BrightYellow,
SecondaryText = LightGrey,
Headers = White
@@ -4606,7 +4627,10 @@ namespace Catch {
#ifdef CATCH_TRAP
#define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); }
#else
- #define CATCH_BREAK_INTO_DEBUGGER() (void)0, 0
+ namespace Catch {
+ inline void doNothing() {}
+ }
+ #define CATCH_BREAK_INTO_DEBUGGER() Catch::doNothing()
#endif
// end catch_debugger.h
@@ -5095,7 +5119,7 @@ namespace Catch {
//
// See https://github.com/philsquared/Clara for more details
-// Clara v1.1.1
+// Clara v1.1.2
#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH
@@ -5751,12 +5775,14 @@ namespace detail {
struct BoundRef : NonCopyable {
virtual ~BoundRef() = default;
virtual auto isContainer() const -> bool { return false; }
+ virtual auto isFlag() const -> bool { return false; }
};
struct BoundValueRefBase : BoundRef {
virtual auto setValue( std::string const &arg ) -> ParserResult = 0;
};
struct BoundFlagRefBase : BoundRef {
virtual auto setFlag( bool flag ) -> ParserResult = 0;
+ virtual auto isFlag() const -> bool { return true; }
};
template
@@ -5987,7 +6013,7 @@ namespace detail {
if( token.type != TokenType::Argument )
return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );
- assert( dynamic_cast( m_ref.get() ) );
+ assert( !m_ref->isFlag() );
auto valueRef = static_cast( m_ref.get() );
auto result = valueRef->setValue( remainingTokens->token );
@@ -6063,14 +6089,14 @@ namespace detail {
if( remainingTokens && remainingTokens->type == TokenType::Option ) {
auto const &token = *remainingTokens;
if( isMatch(token.token ) ) {
- if( auto flagRef = dynamic_cast( m_ref.get() ) ) {
+ if( m_ref->isFlag() ) {
+ auto flagRef = static_cast( m_ref.get() );
auto result = flagRef->setFlag( true );
if( !result )
return InternalParseResult( result );
if( result.value() == ParseResultType::ShortCircuitAll )
return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );
} else {
- assert( dynamic_cast( m_ref.get() ) );
auto valueRef = static_cast( m_ref.get() );
++remainingTokens;
if( !remainingTokens )
@@ -6691,8 +6717,12 @@ namespace {
case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );
case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );
case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );
+ case Colour::BrightYellow: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN );
case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" );
+
+ default:
+ CATCH_ERROR( "Unknown colour requested" );
}
}
@@ -6750,8 +6780,10 @@ namespace {
case Colour::BrightRed: return setColour( "[1;31m" );
case Colour::BrightGreen: return setColour( "[1;32m" );
case Colour::BrightWhite: return setColour( "[1;37m" );
+ case Colour::BrightYellow: return setColour( "[1;33m" );
case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" );
+ default: CATCH_INTERNAL_ERROR( "Unknown colour requested" );
}
}
static IColourImpl* instance() {
@@ -7133,12 +7165,14 @@ namespace Catch {
# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif
+#if (defined(CATCH_PLATFORM_WINDOWS) && defined(CATCH_CONFIG_WINDOWS_SEH)) || defined(CATCH_CONFIG_POSIX_SIGNALS)
namespace {
// Report the error condition
void reportFatal( char const * const message ) {
Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message );
}
}
+#endif
#if defined ( CATCH_PLATFORM_WINDOWS ) /////////////////////////////////////////
@@ -7962,6 +7996,13 @@ namespace Matchers {
// end catch_matchers_string.cpp
// start catch_message.cpp
+// start catch_uncaught_exceptions.h
+
+namespace Catch {
+ bool uncaught_exceptions();
+} // end namespace Catch
+
+// end catch_uncaught_exceptions.h
namespace Catch {
MessageInfo::MessageInfo( std::string const& _macroName,
@@ -8000,19 +8041,11 @@ namespace Catch {
getResultCapture().pushScopedMessage( m_info );
}
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17
-#endif
ScopedMessage::~ScopedMessage() {
- if ( !std::uncaught_exception() ){
+ if ( !uncaught_exceptions() ){
getResultCapture().popScopedMessage(m_info);
}
}
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
} // end namespace Catch
// end catch_message.cpp
// start catch_random_number_generator.cpp
@@ -8652,12 +8685,13 @@ namespace Catch {
handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction );
}
}
+ Counts assertions = m_totals.assertions - prevAssertions;
+ bool missingAssertions = testForMissingAssertions(assertions);
+
m_testCaseTracker->close();
handleUnfinishedSections();
m_messages.clear();
- Counts assertions = m_totals.assertions - prevAssertions;
- bool missingAssertions = testForMissingAssertions(assertions);
SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);
m_reporter->sectionEnded(testCaseSectionStats);
}
@@ -8804,22 +8838,15 @@ namespace Catch {
m_timer.start();
}
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4996) // std::uncaught_exception is deprecated in C++17
-#endif
Section::~Section() {
if( m_sectionIncluded ) {
SectionEndInfo endInfo( m_info, m_assertions, m_timer.getElapsedSeconds() );
- if( std::uncaught_exception() )
+ if( uncaught_exceptions() )
getResultCapture().sectionEndedEarly( endInfo );
else
getResultCapture().sectionEnded( endInfo );
}
}
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
// This indicates whether the section should be executed or not
Section::operator bool() const {
@@ -9470,6 +9497,13 @@ namespace Catch {
#include
#include
+#include
+
+namespace {
+ const uint32_t byte_2_lead = 0xC0;
+ const uint32_t byte_3_lead = 0xE0;
+ const uint32_t byte_4_lead = 0xF0;
+}
namespace Catch {
StringRef::StringRef( char const* rawChars ) noexcept
@@ -9534,13 +9568,12 @@ namespace Catch {
// Make adjustments for uft encodings
for( size_type i=0; i < m_size; ++i ) {
char c = m_start[i];
- if( ( c & 0b11000000 ) == 0b11000000 ) {
- if( ( c & 0b11100000 ) == 0b11000000 )
+ if( ( c & byte_2_lead ) == byte_2_lead ) {
+ noChars--;
+ if (( c & byte_3_lead ) == byte_3_lead )
+ noChars--;
+ if( ( c & byte_4_lead ) == byte_4_lead )
noChars--;
- else if( ( c & 0b11110000 ) == 0b11100000 )
- noChars-=2;
- else if( ( c & 0b11111000 ) == 0b11110000 )
- noChars-=3;
}
}
return noChars;
@@ -10672,6 +10705,20 @@ namespace Catch {
}
// end catch_totals.cpp
+// start catch_uncaught_exceptions.cpp
+
+#include
+
+namespace Catch {
+ bool uncaught_exceptions() {
+#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+ return std::uncaught_exceptions() > 0;
+#else
+ return std::uncaught_exception();
+#endif
+ }
+} // end namespace Catch
+// end catch_uncaught_exceptions.cpp
// start catch_version.cpp
#include
@@ -10704,7 +10751,7 @@ namespace Catch {
}
Version const& libraryVersion() {
- static Version version( 2, 1, 1, "", 0 );
+ static Version version( 2, 1, 2, "", 0 );
return version;
}
@@ -11933,7 +11980,7 @@ namespace Catch {
m_reporterPrefs.shouldRedirectStdOut = true;
}
- JunitReporter::~JunitReporter() {};
+ JunitReporter::~JunitReporter() {}
std::string JunitReporter::getDescription() {
return "Reports test results in an XML format that looks like Ant's junitreport target";
diff --git a/test_package/conanfile.py b/test_package/conanfile.py
index 174beba9..fec93b3c 100644
--- a/test_package/conanfile.py
+++ b/test_package/conanfile.py
@@ -10,7 +10,7 @@ class CatchConanTest(ConanFile):
settings = "os", "compiler", "arch", "build_type"
username = getenv("CONAN_USERNAME", "philsquared")
channel = getenv("CONAN_CHANNEL", "testing")
- requires = "Catch/2.1.1@%s/%s" % (username, channel)
+ requires = "Catch/2.1.2@%s/%s" % (username, channel)
def build(self):
cmake = CMake(self)