diff --git a/README.md b/README.md index 06edcc26bb..7c3f452784 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ ![catch logo](catch-logo-small.png) -*v1.7.0* +*v1.7.1* Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.svg?branch=master)](https://travis-ci.org/philsquared/Catch) -The latest, single header, version can be downloaded directly using this link +The latest, single header, version can be downloaded directly using this link ## What's the Catch? diff --git a/docs/release-notes.md b/docs/release-notes.md index bec9910e7c..0fbf9eefef 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,4 +1,19 @@ -# 1.7.0 +# 1.7.1 + +### Fixes: +* Fixed inconsistency in defining `NOMINMAX` and `WIN32_LEAN_AND_MEAN` inside `catch.hpp`. +* Fixed SEH-related compilation error under older MinGW compilers, by making Windows SEH handling opt-in for compilers other than MSVC. + * For specifics, look into the [documentation](docs/configuration.md). +* Fixed compilation error under MinGW caused by improper compiler detection. +* Fixed XML reporter sometimes leaving an empty output file when a test ends with signal/structured exception. +* Fixed XML reporter not reporting captured stdout/stderr. +* Fixed possible infinite recursion in Windows SEH. +* Fixed possible compilation error caused by Catch's operator overloads being ambiguous in regards to user-defined templated operators. + +# Older versions +Release notes were not maintained prior to v1.6.0, but you should be able to work them out from the Git history + +## 1.7.0 ### Features/ Changes: * Catch now runs significantly faster for passing tests @@ -25,12 +40,6 @@ * Catch's CMakeLists now generates projects with warnings enabled. - - - -# Older versions -Release notes were not maintained prior to v1.6.0, but you should be able to work them out from the Git history - ## 1.6.1 ### Features/ Changes: diff --git a/include/internal/catch_version.hpp b/include/internal/catch_version.hpp index 279facf551..1348989cd5 100644 --- a/include/internal/catch_version.hpp +++ b/include/internal/catch_version.hpp @@ -37,7 +37,7 @@ namespace Catch { return os; } - Version libraryVersion( 1, 7, 0, "", 0 ); + Version libraryVersion( 1, 7, 1, "", 0 ); } diff --git a/single_include/catch.hpp b/single_include/catch.hpp index 99c93f17f7..6a0a58edc2 100644 --- a/single_include/catch.hpp +++ b/single_include/catch.hpp @@ -1,6 +1,6 @@ /* - * Catch v1.7.0 - * Generated: 2017-02-01 21:32:13.239291 + * Catch v1.7.1 + * Generated: 2017-02-07 09:44:56.263047 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved. @@ -81,6 +81,7 @@ // CATCH_CONFIG_VARIADIC_MACROS : are variadic macros supported? // CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? // **************** // Note to maintainers: if new toggles are added please document them // in configuration.md, too @@ -160,6 +161,8 @@ // Visual C++ #ifdef _MSC_VER +#define CATCH_INTERNAL_CONFIG_WINDOWS_SEH + #if (_MSC_VER >= 1600) # define CATCH_INTERNAL_CONFIG_CPP11_NULLPTR # define CATCH_INTERNAL_CONFIG_CPP11_UNIQUE_PTR @@ -284,6 +287,9 @@ # if defined(CATCH_INTERNAL_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_NO_TYPE_TRAITS) && !defined(CATCH_CONFIG_CPP11_TYPE_TRAITS) && !defined(CATCH_CONFIG_NO_CPP11) # define CATCH_CONFIG_CPP11_TYPE_TRAITS # endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS @@ -1878,45 +1884,45 @@ class ExpressionLhs : public DecomposedExpression { template BinaryExpression - operator == ( RhsT const& rhs ) const { + operator == ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression - operator != ( RhsT const& rhs ) const { + operator != ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression - operator < ( RhsT const& rhs ) const { + operator < ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression - operator > ( RhsT const& rhs ) const { + operator > ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression - operator <= ( RhsT const& rhs ) const { + operator <= ( RhsT const& rhs ) { return captureExpression( rhs ); } template BinaryExpression - operator >= ( RhsT const& rhs ) const { + operator >= ( RhsT const& rhs ) { return captureExpression( rhs ); } - BinaryExpression operator == ( bool rhs ) const { + BinaryExpression operator == ( bool rhs ) { return captureExpression( rhs ); } - BinaryExpression operator != ( bool rhs ) const { + BinaryExpression operator != ( bool rhs ) { return captureExpression( rhs ); } @@ -6117,12 +6123,40 @@ namespace Catch { } // namespace Catch #if defined ( CATCH_PLATFORM_WINDOWS ) ///////////////////////////////////////// +// #included from: catch_windows_h_proxy.h + +#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED + +#ifdef CATCH_DEFINES_NOMINMAX +# define NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif -#define NOMINMAX -#define WIN32_LEAN_AND_MEAN +#ifdef __AFXDLL +#include +#else #include -#undef WIN32_LEAN_AND_MEAN -#undef NOMINMAX +#endif + +#ifdef CATCH_DEFINES_NOMINMAX +# undef NOMINMAX +#endif +#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN +# undef WIN32_LEAN_AND_MEAN +#endif + + +# if !defined ( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + struct FatalConditionHandler { + void reset() {} + }; +} + +# else // CATCH_CONFIG_WINDOWS_SEH is defined namespace Catch { @@ -6143,6 +6177,7 @@ namespace Catch { static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { for (int i = 0; i < sizeof(signalDefs) / sizeof(SignalDefs); ++i) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) { + reset(); reportFatal(signalDefs[i].name); } } @@ -6151,22 +6186,25 @@ namespace Catch { return EXCEPTION_CONTINUE_SEARCH; } - // 32k seems enough for Catch to handle stack overflow, - // but the value was found experimentally, so there is no strong guarantee - FatalConditionHandler():m_isSet(true), m_guaranteeSize(32 * 1024), m_exceptionHandlerHandle(CATCH_NULL) { + FatalConditionHandler() { + isSet = true; + // 32k seems enough for Catch to handle stack overflow, + // but the value was found experimentally, so there is no strong guarantee + guaranteeSize = 32 * 1024; + exceptionHandlerHandle = CATCH_NULL; // Register as first handler in current chain - m_exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); + exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); // Pass in guarantee size to be filled - SetThreadStackGuarantee(&m_guaranteeSize); + SetThreadStackGuarantee(&guaranteeSize); } - void reset() { - if (m_isSet) { + static void reset() { + if (isSet) { // Unregister handler and restore the old guarantee - RemoveVectoredExceptionHandler(m_exceptionHandlerHandle); - SetThreadStackGuarantee(&m_guaranteeSize); - m_exceptionHandlerHandle = CATCH_NULL; - m_isSet = false; + RemoveVectoredExceptionHandler(exceptionHandlerHandle); + SetThreadStackGuarantee(&guaranteeSize); + exceptionHandlerHandle = CATCH_NULL; + isSet = false; } } @@ -6174,13 +6212,19 @@ namespace Catch { reset(); } private: - bool m_isSet; - ULONG m_guaranteeSize; - PVOID m_exceptionHandlerHandle; + static bool isSet; + static ULONG guaranteeSize; + static PVOID exceptionHandlerHandle; }; + bool FatalConditionHandler::isSet = false; + ULONG FatalConditionHandler::guaranteeSize = 0; + PVOID FatalConditionHandler::exceptionHandlerHandle = CATCH_NULL; + } // namespace Catch +# endif // CATCH_CONFIG_WINDOWS_SEH + #else // Not Windows - assumed to be POSIX compatible ////////////////////////// #include @@ -7440,30 +7484,6 @@ namespace Catch { #if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// -// #included from: catch_windows_h_proxy.h - -#define TWOBLUECUBES_CATCH_WINDOWS_H_PROXY_H_INCLUDED - -#ifdef CATCH_DEFINES_NOMINMAX -# define NOMINMAX -#endif -#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif - -#ifdef __AFXDLL -#include -#else -#include -#endif - -#ifdef CATCH_DEFINES_NOMINMAX -# undef NOMINMAX -#endif -#ifdef CATCH_DEFINES_WIN32_LEAN_AND_MEAN -# undef WIN32_LEAN_AND_MEAN -#endif - namespace Catch { namespace { @@ -7989,7 +8009,7 @@ namespace Catch { return os; } - Version libraryVersion( 1, 7, 0, "", 0 ); + Version libraryVersion( 1, 7, 1, "", 0 ); } @@ -9506,12 +9526,13 @@ namespace Catch { newlineIfNecessary(); m_indent = m_indent.substr( 0, m_indent.size()-2 ); if( m_tagIsOpen ) { - stream() << "/>\n"; + stream() << "/>"; m_tagIsOpen = false; } else { - stream() << m_indent << "\n"; + stream() << m_indent << ""; } + stream() << std::endl; m_tags.pop_back(); return *this; } @@ -9757,6 +9778,11 @@ namespace Catch { if ( m_config->showDurations() == ShowDurations::Always ) e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); + if( !testCaseStats.stdOut.empty() ) + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); + if( !testCaseStats.stdErr.empty() ) + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); + m_xml.endElement(); } @@ -9804,7 +9830,7 @@ namespace Catch { std::time(&rawtime); const size_t timeStampSize = sizeof("2017-01-16T17:06:45Z"); -#ifdef CATCH_PLATFORM_WINDOWS +#ifdef _MSC_VER std::tm timeInfo = {}; gmtime_s(&timeInfo, &rawtime); #else @@ -9815,7 +9841,7 @@ namespace Catch { char timeStamp[timeStampSize]; const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; -#ifdef CATCH_PLATFORM_WINDOWS +#ifdef _MSC_VER std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); #else std::strftime(timeStamp, timeStampSize, fmt, timeInfo);