diff --git a/include/internal/catch_assertionresult.h b/include/internal/catch_assertionresult.h index 7cfe4d83..adcc0215 100644 --- a/include/internal/catch_assertionresult.h +++ b/include/internal/catch_assertionresult.h @@ -41,6 +41,12 @@ namespace Catch { AssertionResult(); AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); ~AssertionResult(); +# ifdef CATCH_CPP11_OR_GREATER + AssertionResult( AssertionResult const& ) = default; + AssertionResult( AssertionResult && ) = default; + AssertionResult& operator = ( AssertionResult const& ) = default; + AssertionResult& operator = ( AssertionResult && ) = default; +# endif bool isOk() const; bool succeeded() const; diff --git a/include/internal/catch_common.h b/include/internal/catch_common.h index 7759987d..2f64b5b2 100644 --- a/include/internal/catch_common.h +++ b/include/internal/catch_common.h @@ -113,6 +113,11 @@ namespace Catch { : file( other.file ), line( other.line ) {} +# ifdef CATCH_CPP11_OR_GREATER + SourceLineInfo( SourceLineInfo && ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo& operator = ( SourceLineInfo && ) = default; +# endif bool empty() const { return file.empty(); } diff --git a/include/internal/catch_compiler_capabilities.h b/include/internal/catch_compiler_capabilities.h index 8191e967..c32d5b55 100644 --- a/include/internal/catch_compiler_capabilities.h +++ b/include/internal/catch_compiler_capabilities.h @@ -81,5 +81,27 @@ #endif +//////////////////////////////////////////////////////////////////////////////// +// C++ language feature support + +// detect language version: +#if (__cplusplus == 201103L) +# define CATCH_CPP11 +# define CATCH_CPP11_OR_GREATER +#elif (__cplusplus >= 201103L) +# define CATCH_CPP11_OR_GREATER +#endif + +// noexcept support: +#ifdef CATCH_CPP11_OR_GREATER +# if (__has_feature(cxx_noexcept)) +# define CATCH_NOEXCEPT noexcept +# define CATCH_NOEXCEPT_IS(x) noexcept(x) +# endif +#else +# define CATCH_NOEXCEPT throw() +# define CATCH_NOEXCEPT_IS(x) +#endif + #endif // TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED diff --git a/include/internal/catch_expression_lhs.hpp b/include/internal/catch_expression_lhs.hpp index 271e8dcb..81753fbc 100644 --- a/include/internal/catch_expression_lhs.hpp +++ b/include/internal/catch_expression_lhs.hpp @@ -14,14 +14,21 @@ namespace Catch { -// Wraps the LHS of an expression and captures the operator and RHS (if any) - wrapping them all -// in an ExpressionResultBuilder object +// Wraps the LHS of an expression and captures the operator and RHS (if any) - +// wrapping them all in an ExpressionResultBuilder object template class ExpressionLhs { - void operator = ( ExpressionLhs const& ); + ExpressionLhs& operator = ( ExpressionLhs const& ); +# ifdef CATCH_CPP11_OR_GREATER + ExpressionLhs& operator = ( ExpressionLhs && ) = delete; +# endif public: ExpressionLhs( T lhs ) : m_lhs( lhs ) {} +# ifdef CATCH_CPP11_OR_GREATER + ExpressionLhs( ExpressionLhs const& ) = default; + ExpressionLhs( ExpressionLhs && ) = default; +# endif template ExpressionResultBuilder& operator == ( RhsT const& rhs ) { diff --git a/include/internal/catch_impl.hpp b/include/internal/catch_impl.hpp index 30ac219d..99e35113 100644 --- a/include/internal/catch_impl.hpp +++ b/include/internal/catch_impl.hpp @@ -39,7 +39,7 @@ namespace Catch { NonCopyable::~NonCopyable() {} IShared::~IShared() {} - StreamBufBase::~StreamBufBase() throw() {} + StreamBufBase::~StreamBufBase() CATCH_NOEXCEPT {} IContext::~IContext() {} IResultCapture::~IResultCapture() {} ITestCase::~ITestCase() {} diff --git a/include/internal/catch_interfaces_reporter.h b/include/internal/catch_interfaces_reporter.h index 1de4778e..50d42150 100644 --- a/include/internal/catch_interfaces_reporter.h +++ b/include/internal/catch_interfaces_reporter.h @@ -114,6 +114,13 @@ namespace Catch } virtual ~AssertionStats(); +# ifdef CATCH_CPP11_OR_GREATER + AssertionStats( AssertionStats const& ) = default; + AssertionStats( AssertionStats && ) = default; + AssertionStats& operator = ( AssertionStats const& ) = default; + AssertionStats& operator = ( AssertionStats && ) = default; +# endif + AssertionResult assertionResult; std::vector infoMessages; Totals totals; @@ -130,6 +137,12 @@ namespace Catch missingAssertions( _missingAssertions ) {} virtual ~SectionStats(); +# ifdef CATCH_CPP11_OR_GREATER + SectionStats( SectionStats const& ) = default; + SectionStats( SectionStats && ) = default; + SectionStats& operator = ( SectionStats const& ) = default; + SectionStats& operator = ( SectionStats && ) = default; +# endif SectionInfo sectionInfo; Counts assertions; @@ -151,6 +164,13 @@ namespace Catch {} virtual ~TestCaseStats(); +# ifdef CATCH_CPP11_OR_GREATER + TestCaseStats( TestCaseStats const& ) = default; + TestCaseStats( TestCaseStats && ) = default; + TestCaseStats& operator = ( TestCaseStats const& ) = default; + TestCaseStats& operator = ( TestCaseStats && ) = default; +# endif + TestCaseInfo testInfo; Totals totals; std::string stdOut; @@ -172,6 +192,13 @@ namespace Catch {} virtual ~TestGroupStats(); +# ifdef CATCH_CPP11_OR_GREATER + TestGroupStats( TestGroupStats const& ) = default; + TestGroupStats( TestGroupStats && ) = default; + TestGroupStats& operator = ( TestGroupStats const& ) = default; + TestGroupStats& operator = ( TestGroupStats && ) = default; +# endif + GroupInfo groupInfo; Totals totals; bool aborting; @@ -185,12 +212,20 @@ namespace Catch totals( _totals ), aborting( _aborting ) {} + virtual ~TestRunStats(); + +# ifndef CATCH_CPP11_OR_GREATER TestRunStats( TestRunStats const& _other ) : runInfo( _other.runInfo ), totals( _other.totals ), aborting( _other.aborting ) {} - virtual ~TestRunStats(); +# else + TestRunStats( TestRunStats const& ) = default; + TestRunStats( TestRunStats && ) = default; + TestRunStats& operator = ( TestRunStats const& ) = default; + TestRunStats& operator = ( TestRunStats && ) = default; +# endif TestRunInfo runInfo; Totals totals; diff --git a/include/internal/catch_notimplemented_exception.h b/include/internal/catch_notimplemented_exception.h index e543bdaf..84b1cf3f 100644 --- a/include/internal/catch_notimplemented_exception.h +++ b/include/internal/catch_notimplemented_exception.h @@ -18,9 +18,9 @@ namespace Catch { public: NotImplementedException( SourceLineInfo const& lineInfo ); - virtual ~NotImplementedException() throw() {} + virtual ~NotImplementedException() CATCH_NOEXCEPT {} - virtual const char* what() const throw(); + virtual const char* what() const CATCH_NOEXCEPT; private: std::string m_what; diff --git a/include/internal/catch_notimplemented_exception.hpp b/include/internal/catch_notimplemented_exception.hpp index 4683dcc1..4d263f1b 100644 --- a/include/internal/catch_notimplemented_exception.hpp +++ b/include/internal/catch_notimplemented_exception.hpp @@ -21,7 +21,7 @@ namespace Catch { m_what = oss.str(); } - const char* NotImplementedException::what() const throw() { + const char* NotImplementedException::what() const CATCH_NOEXCEPT { return m_what.c_str(); } diff --git a/include/internal/catch_section.hpp b/include/internal/catch_section.hpp index e58e72a8..01e73e0b 100644 --- a/include/internal/catch_section.hpp +++ b/include/internal/catch_section.hpp @@ -33,6 +33,13 @@ namespace Catch { getCurrentContext().getResultCapture().sectionEnded( m_info, m_assertions, m_timer.getElapsedSeconds() ); } +# ifdef CATCH_CPP11_OR_GREATER + Section( Section const& ) = default; + Section( Section && ) = default; + Section& operator = ( Section const& ) = default; + Section& operator = ( Section && ) = default; +# endif + // This indicates whether the section should be executed or not operator bool() { return m_sectionIncluded; diff --git a/include/internal/catch_stream.hpp b/include/internal/catch_stream.hpp index eea576ef..add38fac 100644 --- a/include/internal/catch_stream.hpp +++ b/include/internal/catch_stream.hpp @@ -27,7 +27,7 @@ namespace Catch { setp( data, data + sizeof(data) ); } - ~StreamBufImpl() throw() { + ~StreamBufImpl() CATCH_NOEXCEPT { sync(); } diff --git a/include/internal/catch_streambuf.h b/include/internal/catch_streambuf.h index 6a601dbd..87a82a16 100644 --- a/include/internal/catch_streambuf.h +++ b/include/internal/catch_streambuf.h @@ -14,7 +14,7 @@ namespace Catch { class StreamBufBase : public std::streambuf { public: - virtual ~StreamBufBase() throw(); + virtual ~StreamBufBase() CATCH_NOEXCEPT; }; } diff --git a/include/internal/catch_xmlwriter.hpp b/include/internal/catch_xmlwriter.hpp index 5593022c..3b19b945 100644 --- a/include/internal/catch_xmlwriter.hpp +++ b/include/internal/catch_xmlwriter.hpp @@ -66,11 +66,18 @@ namespace Catch { endElement(); } +# ifndef CATCH_CPP11_OR_GREATER XmlWriter& operator = ( XmlWriter const& other ) { XmlWriter temp( other ); swap( temp ); return *this; } +# else + XmlWriter( XmlWriter const& ) = default; + XmlWriter( XmlWriter && ) = default; + XmlWriter& operator = ( XmlWriter const& ) = default; + XmlWriter& operator = ( XmlWriter && ) = default; +# endif void swap( XmlWriter& other ) { std::swap( m_tagIsOpen, other.m_tagIsOpen ); diff --git a/include/internal/clara.h b/include/internal/clara.h index a401edd8..5f3cb7e1 100644 --- a/include/internal/clara.h +++ b/include/internal/clara.h @@ -52,6 +52,10 @@ namespace Clara { template struct IArgFunction { virtual ~IArgFunction() {} +# ifdef CATCH_CPP11_OR_GREATER + IArgFunction() = default; + IArgFunction( IArgFunction const& ) = default; +# endif virtual void set( ConfigT& config, std::string const& value ) const = 0; virtual void setFlag( ConfigT& config ) const = 0; virtual bool takesArg() const = 0;