diff --git a/recipes-musicians/surge/surge.bb b/recipes-musicians/surge/surge.bb index d2bf5fa..87c2b68 100644 --- a/recipes-musicians/surge/surge.bb +++ b/recipes-musicians/surge/surge.bb @@ -22,7 +22,7 @@ SRC_URI = " \ file://0002-package-vst3.sh-Do-not-try-to-strip-antive.patch \ file://0003-Do-not-generate-manifest-it-won-t-work-cross.patch \ file://0004-emit-vector-piggy-adjust-python-python3.patch \ - file://0005-Workaround-build-failure-with-glibc-2.34.patch \ + file://0005-Upgrade-Catch-2-4845.patch \ " SRCREV = "91069f8d0c0269e962fa3b5f932b4511aa07e451" S = "${WORKDIR}/git" diff --git a/recipes-musicians/surge/surge/0005-Upgrade-Catch-2-4845.patch b/recipes-musicians/surge/surge/0005-Upgrade-Catch-2-4845.patch new file mode 100644 index 0000000..0709078 --- /dev/null +++ b/recipes-musicians/surge/surge/0005-Upgrade-Catch-2-4845.patch @@ -0,0 +1,5375 @@ +From 7a552038bab4b000d188ae425aa97963dc91db17 Mon Sep 17 00:00:00 2001 +From: Paul +Date: Mon, 16 Aug 2021 15:52:39 -0400 +Subject: [PATCH] Upgrade Catch 2 (#4845) + +From 2.9.2 (mid-2019) to 2.13.7 (mid-2021) + +Upstream-Status: Accepted[https://github.com/surge-synthesizer/surge/commit/7a552038bab4b000d188ae425aa97963dc91db17] +--- + libs/catch2/include/catch2/catch2.hpp | 2908 ++++++++++++++++--------- + 1 file changed, 1895 insertions(+), 1013 deletions(-) + +diff --git a/libs/catch2/include/catch2/catch2.hpp b/libs/catch2/include/catch2/catch2.hpp +index 643d6a00..7e706f94 100644 +--- a/libs/catch2/include/catch2/catch2.hpp ++++ b/libs/catch2/include/catch2/catch2.hpp +@@ -1,9 +1,9 @@ + /* +- * Catch v2.9.2 +- * Generated: 2019-08-08 13:35:12.279703 ++ * Catch v2.13.7 ++ * Generated: 2021-07-28 20:29:27.753164 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly +- * Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved. ++ * Copyright (c) 2021 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +@@ -12,9 +12,10 @@ + #define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + // start catch.hpp + ++ + #define CATCH_VERSION_MAJOR 2 +-#define CATCH_VERSION_MINOR 9 +-#define CATCH_VERSION_PATCH 2 ++#define CATCH_VERSION_MINOR 13 ++#define CATCH_VERSION_PATCH 7 + + #ifdef __clang__ + # pragma clang system_header +@@ -65,15 +66,18 @@ + #if !defined(CATCH_CONFIG_IMPL_ONLY) + // start catch_platform.h + ++// See e.g.: ++// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html + #ifdef __APPLE__ +-# include +-# if TARGET_OS_OSX == 1 +-# define CATCH_PLATFORM_MAC +-# elif TARGET_OS_IPHONE == 1 +-# define CATCH_PLATFORM_IPHONE +-# endif ++# include ++# if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \ ++ (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1) ++# define CATCH_PLATFORM_MAC ++# elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) ++# define CATCH_PLATFORM_IPHONE ++# endif + +-#elif defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) ++#elif defined(linux) || defined(__linux) || defined(__linux__) + # define CATCH_PLATFORM_LINUX + + #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) +@@ -131,36 +135,51 @@ namespace Catch { + + #endif + +-#if defined(CATCH_CPP17_OR_GREATER) +-# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS ++// Only GCC compiler should be used in this block, so other compilers trying to ++// mask themselves as GCC should be ignored. ++#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__) ++# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) ++# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) ++ ++# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) ++ + #endif + +-#ifdef __clang__ ++#if defined(__clang__) ++ ++# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) ++# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) ++ ++// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug ++// which results in calls to destructors being emitted for each temporary, ++// without a matching initialization. In practice, this can result in something ++// like `std::string::~string` being called on an uninitialized value. ++// ++// For example, this code will likely segfault under IBM XL: ++// ``` ++// REQUIRE(std::string("12") + "34" == "1234") ++// ``` ++// ++// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. ++# if !defined(__ibmxl__) && !defined(__CUDACC__) ++# 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 \ ++ _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ ++ _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") ++ ++# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ ++ _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) ++ ++# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ ++ _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) + +-# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ +- _Pragma( "clang diagnostic push" ) \ +- _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ +- _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") +-# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ +- _Pragma( "clang diagnostic pop" ) +- +-# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ +- _Pragma( "clang diagnostic push" ) \ +- _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) +-# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ +- _Pragma( "clang diagnostic pop" ) +- +-# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ +- _Pragma( "clang diagnostic push" ) \ +- _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) +-# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ +- _Pragma( "clang diagnostic pop" ) +- +-# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ +- _Pragma( "clang diagnostic push" ) \ +- _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) +-# define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ +- _Pragma( "clang diagnostic pop" ) ++# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ ++ _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) ++ ++# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ ++ _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) + + #endif // __clang__ + +@@ -185,6 +204,7 @@ namespace Catch { + // Android somehow still does not support std::to_string + #if defined(__ANDROID__) + # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING ++# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE + #endif + + //////////////////////////////////////////////////////////////////////////////// +@@ -218,11 +238,10 @@ namespace Catch { + + //////////////////////////////////////////////////////////////////////////////// + // Visual C++ +-#ifdef _MSC_VER ++#if defined(_MSC_VER) + +-# if _MSC_VER >= 1900 // Visual Studio 2015 or newer +-# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +-# endif ++# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) ++# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) + + // Universal Windows platform does not support SEH + // Or console colours (or console at all...) +@@ -235,9 +254,12 @@ namespace Catch { + // MSVC traditional preprocessor needs some workaround for __VA_ARGS__ + // _MSVC_TRADITIONAL == 0 means new conformant preprocessor + // _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor +-# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) +-# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +-# endif ++# if !defined(__clang__) // Handle Clang masquerading for msvc ++# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) ++# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR ++# endif // MSVC_TRADITIONAL ++# endif // __clang__ ++ + #endif // _MSC_VER + + #if defined(_REENTRANT) || defined(_MSC_VER) +@@ -285,49 +307,46 @@ namespace Catch { + #define CATCH_CONFIG_COLOUR_NONE + #endif + +-//////////////////////////////////////////////////////////////////////////////// +-// Check if string_view is available and usable +-// The check is split apart to work around v140 (VS2015) preprocessor issue... +-#if defined(__has_include) +-#if __has_include() && defined(CATCH_CPP17_OR_GREATER) +-# define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW ++#if !defined(_GLIBCXX_USE_C99_MATH_TR1) ++#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER + #endif +-#endif +- +-//////////////////////////////////////////////////////////////////////////////// +-// Check if optional is available and usable +-#if defined(__has_include) +-# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +-# define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL +-# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) +-#endif // __has_include +- +-//////////////////////////////////////////////////////////////////////////////// +-// Check if byte is available and usable +-#if defined(__has_include) +-# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +-# define CATCH_INTERNAL_CONFIG_CPP17_BYTE +-# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) +-#endif // __has_include + +-//////////////////////////////////////////////////////////////////////////////// +-// Check if variant is available and usable ++// Various stdlib support checks that require __has_include + #if defined(__has_include) +-# if __has_include() && defined(CATCH_CPP17_OR_GREATER) +-# if defined(__clang__) && (__clang_major__ < 8) +- // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 +- // fix should be in clang 8, workaround in libstdc++ 8.2 +-# include +-# if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) +-# define CATCH_CONFIG_NO_CPP17_VARIANT +-# else +-# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT +-# endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) +-# else +-# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT +-# endif // defined(__clang__) && (__clang_major__ < 8) +-# endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) +-#endif // __has_include ++ // Check if string_view is available and usable ++ #if __has_include() && defined(CATCH_CPP17_OR_GREATER) ++ # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW ++ #endif ++ ++ // Check if optional is available and usable ++ # if __has_include() && defined(CATCH_CPP17_OR_GREATER) ++ # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL ++ # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) ++ ++ // Check if byte is available and usable ++ # if __has_include() && defined(CATCH_CPP17_OR_GREATER) ++ # include ++ # if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0) ++ # define CATCH_INTERNAL_CONFIG_CPP17_BYTE ++ # endif ++ # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) ++ ++ // Check if variant is available and usable ++ # if __has_include() && defined(CATCH_CPP17_OR_GREATER) ++ # if defined(__clang__) && (__clang_major__ < 8) ++ // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 ++ // fix should be in clang 8, workaround in libstdc++ 8.2 ++ # include ++ # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) ++ # define CATCH_CONFIG_NO_CPP17_VARIANT ++ # else ++ # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT ++ # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) ++ # else ++ # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT ++ # endif // defined(__clang__) && (__clang_major__ < 8) ++ # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) ++#endif // defined(__has_include) + + #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) + # define CATCH_CONFIG_COUNTER +@@ -352,10 +371,6 @@ namespace Catch { + # define CATCH_CONFIG_CPP17_OPTIONAL + #endif + +-#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) +-# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +-#endif +- + #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) + # define CATCH_CONFIG_CPP17_STRING_VIEW + #endif +@@ -388,21 +403,49 @@ namespace Catch { + # define CATCH_CONFIG_USE_ASYNC + #endif + ++#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) ++# define CATCH_CONFIG_ANDROID_LOGWRITE ++#endif ++ ++#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) ++# define CATCH_CONFIG_GLOBAL_NEXTAFTER ++#endif ++ ++// Even if we do not think the compiler has that warning, we still have ++// to provide a macro that can be used by the code. ++#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) ++# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION ++#endif ++#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) ++# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION ++#endif + #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) + # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +-# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS + #endif + #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) + # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS +-# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS + #endif + #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) + # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS +-# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS + #endif + #if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) + # define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS +-# define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS ++#endif ++ ++// The goal of this macro is to avoid evaluation of the arguments, but ++// still have the compiler warn on problems inside... ++#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) ++# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) ++#endif ++ ++#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) ++# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS ++#elif defined(__clang__) && (__clang_major__ < 5) ++# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS ++#endif ++ ++#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) ++# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS + #endif + + #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +@@ -467,7 +510,7 @@ namespace Catch { + SourceLineInfo( SourceLineInfo&& ) noexcept = default; + SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; + +- bool empty() const noexcept; ++ bool empty() const noexcept { return file[0] == '\0'; } + bool operator == ( SourceLineInfo const& other ) const noexcept; + bool operator < ( SourceLineInfo const& other ) const noexcept; + +@@ -508,9 +551,10 @@ namespace Catch { + } // end namespace Catch + + #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ ++ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ +- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS ++ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + // end catch_tag_alias_autoregistrar.h + // start catch_test_registry.h +@@ -550,53 +594,30 @@ namespace Catch { + #include + #include + #include ++#include + + namespace Catch { + + /// A non-owning string class (similar to the forthcoming std::string_view) + /// Note that, because a StringRef may be a substring of another string, +- /// it may not be null terminated. c_str() must return a null terminated +- /// string, however, and so the StringRef will internally take ownership +- /// (taking a copy), if necessary. In theory this ownership is not externally +- /// visible - but it does mean (substring) StringRefs should not be shared between +- /// threads. ++ /// it may not be null terminated. + class StringRef { + public: + using size_type = std::size_t; ++ using const_iterator = const char*; + + private: +- friend struct StringRefTestAccess; +- +- char const* m_start; +- size_type m_size; +- +- char* m_data = nullptr; +- +- void takeOwnership(); +- + static constexpr char const* const s_empty = ""; + +- public: // construction/ assignment +- StringRef() noexcept +- : StringRef( s_empty, 0 ) +- {} +- +- StringRef( StringRef const& other ) noexcept +- : m_start( other.m_start ), +- m_size( other.m_size ) +- {} ++ char const* m_start = s_empty; ++ size_type m_size = 0; + +- StringRef( StringRef&& other ) noexcept +- : m_start( other.m_start ), +- m_size( other.m_size ), +- m_data( other.m_data ) +- { +- other.m_data = nullptr; +- } ++ public: // construction ++ constexpr StringRef() noexcept = default; + + StringRef( char const* rawChars ) noexcept; + +- StringRef( char const* rawChars, size_type size ) noexcept ++ constexpr StringRef( char const* rawChars, size_type size ) noexcept + : m_start( rawChars ), + m_size( size ) + {} +@@ -606,101 +627,64 @@ namespace Catch { + m_size( stdString.size() ) + {} + +- ~StringRef() noexcept { +- delete[] m_data; ++ explicit operator std::string() const { ++ return std::string(m_start, m_size); + } + +- auto operator = ( StringRef const &other ) noexcept -> StringRef& { +- delete[] m_data; +- m_data = nullptr; +- m_start = other.m_start; +- m_size = other.m_size; +- return *this; +- } +- +- operator std::string() const; +- +- void swap( StringRef& other ) noexcept; +- + public: // operators + auto operator == ( StringRef const& other ) const noexcept -> bool; +- auto operator != ( StringRef const& other ) const noexcept -> bool; ++ auto operator != (StringRef const& other) const noexcept -> bool { ++ return !(*this == other); ++ } + +- auto operator[] ( size_type index ) const noexcept -> char; ++ auto operator[] ( size_type index ) const noexcept -> char { ++ assert(index < m_size); ++ return m_start[index]; ++ } + + public: // named queries +- auto empty() const noexcept -> bool { ++ constexpr auto empty() const noexcept -> bool { + return m_size == 0; + } +- auto size() const noexcept -> size_type { ++ constexpr auto size() const noexcept -> size_type { + return m_size; + } + +- auto numberOfCharacters() const noexcept -> size_type; ++ // Returns the current start pointer. If the StringRef is not ++ // null-terminated, throws std::domain_exception + auto c_str() const -> char const*; + + public: // substrings and searches +- auto substr( size_type start, size_type size ) const noexcept -> StringRef; ++ // Returns a substring of [start, start + length). ++ // If start + length > size(), then the substring is [start, size()). ++ // If start > size(), then the substring is empty. ++ auto substr( size_type start, size_type length ) const noexcept -> StringRef; + +- // Returns the current start pointer. +- // Note that the pointer can change when if the StringRef is a substring +- auto currentData() const noexcept -> char const*; ++ // Returns the current start pointer. May not be null-terminated. ++ auto data() const noexcept -> char const*; + +- private: // ownership queries - may not be consistent between calls +- auto isOwned() const noexcept -> bool; +- auto isSubstring() const noexcept -> bool; +- }; ++ constexpr auto isNullTerminated() const noexcept -> bool { ++ return m_start[m_size] == '\0'; ++ } + +- auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string; +- auto operator + ( StringRef const& lhs, char const* rhs ) -> std::string; +- auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string; ++ public: // iterators ++ constexpr const_iterator begin() const { return m_start; } ++ constexpr const_iterator end() const { return m_start + m_size; } ++ }; + + auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; + auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; + +- inline auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { ++ constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { + return StringRef( rawChars, size ); + } +- + } // namespace Catch + +-inline auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { ++constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { + return Catch::StringRef( rawChars, size ); + } + + // end catch_stringref.h +-// start catch_type_traits.hpp +- +- +-#include +- +-namespace Catch{ +- +-#ifdef CATCH_CPP17_OR_GREATER +- template +- inline constexpr auto is_unique = std::true_type{}; +- +- template +- inline constexpr auto is_unique = std::bool_constant< +- (!std::is_same_v && ...) && is_unique +- >{}; +-#else +- +-template +-struct is_unique : std::true_type{}; +- +-template +-struct is_unique : std::integral_constant +-::value +- && is_unique::value +- && is_unique::value +->{}; +- +-#endif +-} +- +-// end catch_type_traits.hpp + // start catch_preprocessor.hpp + + +@@ -785,7 +769,7 @@ struct is_unique : std::integral_constant + #define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) + #define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) + #define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) +-#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6) ++#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) + #define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) + #define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) + #define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) +@@ -797,35 +781,49 @@ struct is_unique : std::integral_constant + template struct TypeList {};\ + template\ + constexpr auto get_wrapper() noexcept -> TypeList { return {}; }\ ++ template class...> struct TemplateTypeList{};\ ++ template class...Cs>\ ++ constexpr auto get_wrapper() noexcept -> TemplateTypeList { return {}; }\ ++ template\ ++ struct append;\ ++ template\ ++ struct rewrap;\ ++ template class, typename...>\ ++ struct create;\ ++ template class, typename>\ ++ struct convert;\ + \ +- template class L1, typename...E1, template class L2, typename...E2> \ +- constexpr auto append(L1, L2) noexcept -> L1 { return {}; }\ ++ template \ ++ struct append { using type = T; };\ + template< template class L1, typename...E1, template class L2, typename...E2, typename...Rest>\ +- constexpr auto append(L1, L2, Rest...) noexcept -> decltype(append(L1{}, Rest{}...)) { return {}; }\ ++ struct append, L2, Rest...> { using type = typename append, Rest...>::type; };\ + template< template class L1, typename...E1, typename...Rest>\ +- constexpr auto append(L1, TypeList, Rest...) noexcept -> L1 { return {}; }\ ++ struct append, TypeList, Rest...> { using type = L1; };\ + \ + template< template class Container, template class List, typename...elems>\ +- constexpr auto rewrap(List) noexcept -> TypeList> { return {}; }\ ++ struct rewrap, List> { using type = TypeList>; };\ + template< template class Container, template class List, class...Elems, typename...Elements>\ +- constexpr auto rewrap(List,Elements...) noexcept -> decltype(append(TypeList>{}, rewrap(Elements{}...))) { return {}; }\ ++ struct rewrap, List, Elements...> { using type = typename append>, typename rewrap, Elements...>::type>::type; };\ + \ + template