Hide std::exception_ptr and friends if exceptions disabled

Some compilers, e.g. the Green Hills C++ compiler, react badly to the
appearance of std::exception_ptr, std::current_exception,
std::rethrow_exception and std::uncaught_exception(s). To allow usage of
Catch2 with these compilers when exceptions are disabled, hide the usage
of std::exception_ptr etc. when compiling with
CATCH_CONFIG_DISABLE_EXCEPTIONS.
This commit is contained in:
Matthias Blankertz 2020-06-04 11:53:13 +02:00 committed by Martin Hořeňovský
parent 657ebf5db2
commit 9221a6ff65
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
3 changed files with 13 additions and 2 deletions

View File

@ -9,6 +9,7 @@
#include <catch2/interfaces/catch_interfaces_registry_hub.hpp> #include <catch2/interfaces/catch_interfaces_registry_hub.hpp>
#include <catch2/internal/catch_context.hpp> #include <catch2/internal/catch_context.hpp>
#include <catch2/internal/catch_enforce.hpp>
#include <catch2/internal/catch_test_case_registry_impl.hpp> #include <catch2/internal/catch_test_case_registry_impl.hpp>
#include <catch2/internal/catch_reporter_registry.hpp> #include <catch2/internal/catch_reporter_registry.hpp>
#include <catch2/internal/catch_exception_translator_registry.hpp> #include <catch2/internal/catch_exception_translator_registry.hpp>
@ -59,7 +60,11 @@ namespace Catch {
m_tagAliasRegistry.add( alias, tag, lineInfo ); m_tagAliasRegistry.add( alias, tag, lineInfo );
} }
void registerStartupException() noexcept override { void registerStartupException() noexcept override {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
m_exceptionRegistry.add(std::current_exception()); m_exceptionRegistry.add(std::current_exception());
#else
CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
#endif
} }
IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override { IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {
return m_enumValuesRegistry; return m_enumValuesRegistry;

View File

@ -73,7 +73,9 @@ namespace Catch {
namespace Catch { namespace Catch {
bool uncaught_exceptions() { bool uncaught_exceptions() {
#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) || (defined(__cpp_lib_uncaught_exceptions) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS)) #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
return false;
#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) || (defined(__cpp_lib_uncaught_exceptions) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS))
return std::uncaught_exceptions() > 0; return std::uncaught_exceptions() > 0;
#else #else
return std::uncaught_exception(); return std::uncaught_exception();
@ -122,7 +124,8 @@ namespace Catch {
#include <catch2/internal/catch_compiler_capabilities.hpp> #include <catch2/internal/catch_compiler_capabilities.hpp>
namespace Catch { namespace Catch {
void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept {
CATCH_TRY { CATCH_TRY {
m_exceptions.push_back(exception); m_exceptions.push_back(exception);
} CATCH_CATCH_ALL { } CATCH_CATCH_ALL {
@ -134,6 +137,7 @@ void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexce
std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept { std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept {
return m_exceptions; return m_exceptions;
} }
#endif
} // end namespace Catch } // end namespace Catch

View File

@ -15,11 +15,13 @@
namespace Catch { namespace Catch {
class StartupExceptionRegistry { class StartupExceptionRegistry {
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
public: public:
void add(std::exception_ptr const& exception) noexcept; void add(std::exception_ptr const& exception) noexcept;
std::vector<std::exception_ptr> const& getExceptions() const noexcept; std::vector<std::exception_ptr> const& getExceptions() const noexcept;
private: private:
std::vector<std::exception_ptr> m_exceptions; std::vector<std::exception_ptr> m_exceptions;
#endif
}; };
} // end namespace Catch } // end namespace Catch