mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-25 10:45:40 +02:00 
			
		
		
		
	Improve detection of std::uncaught_exceptions support
The problem was that Catch2 did not reliably include `<exception>` before it checked for the feature test macro for `std::uncaught_exceptions`. To avoid overhead of including `<exception>` everywhere, the configuration check was split out into a separate header. Closes #2021
This commit is contained in:
		| @@ -50,6 +50,7 @@ set(INTERNAL_HEADERS | |||||||
|     ${SOURCES_DIR}/internal/catch_common.hpp |     ${SOURCES_DIR}/internal/catch_common.hpp | ||||||
|     ${SOURCES_DIR}/internal/catch_compiler_capabilities.hpp |     ${SOURCES_DIR}/internal/catch_compiler_capabilities.hpp | ||||||
|     ${SOURCES_DIR}/catch_config.hpp |     ${SOURCES_DIR}/catch_config.hpp | ||||||
|  |     ${SOURCES_DIR}/internal/catch_config_uncaught_exceptions.hpp | ||||||
|     ${SOURCES_DIR}/internal/catch_console_colour.hpp |     ${SOURCES_DIR}/internal/catch_console_colour.hpp | ||||||
|     ${SOURCES_DIR}/internal/catch_context.hpp |     ${SOURCES_DIR}/internal/catch_context.hpp | ||||||
|     ${SOURCES_DIR}/internal/catch_debug_console.hpp |     ${SOURCES_DIR}/internal/catch_debug_console.hpp | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ | |||||||
| #include <catch2/internal/catch_commandline.hpp> | #include <catch2/internal/catch_commandline.hpp> | ||||||
| #include <catch2/internal/catch_common.hpp> | #include <catch2/internal/catch_common.hpp> | ||||||
| #include <catch2/internal/catch_compiler_capabilities.hpp> | #include <catch2/internal/catch_compiler_capabilities.hpp> | ||||||
|  | #include <catch2/internal/catch_config_uncaught_exceptions.hpp> | ||||||
| #include <catch2/internal/catch_console_colour.hpp> | #include <catch2/internal/catch_console_colour.hpp> | ||||||
| #include <catch2/internal/catch_console_width.hpp> | #include <catch2/internal/catch_console_width.hpp> | ||||||
| #include <catch2/internal/catch_container_nonmembers.hpp> | #include <catch2/internal/catch_container_nonmembers.hpp> | ||||||
|   | |||||||
| @@ -76,13 +76,15 @@ namespace Catch { | |||||||
|  |  | ||||||
| #include <catch2/internal/catch_compiler_capabilities.hpp> | #include <catch2/internal/catch_compiler_capabilities.hpp> | ||||||
| #include <catch2/internal/catch_uncaught_exceptions.hpp> | #include <catch2/internal/catch_uncaught_exceptions.hpp> | ||||||
|  | #include <catch2/internal/catch_config_uncaught_exceptions.hpp> | ||||||
|  |  | ||||||
| #include <exception> | #include <exception> | ||||||
|  |  | ||||||
| namespace Catch { | namespace Catch { | ||||||
|     bool uncaught_exceptions() { |     bool uncaught_exceptions() { | ||||||
| #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) | #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) | ||||||
|         return false; |         return false; | ||||||
| #elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) || (defined(__cpp_lib_uncaught_exceptions) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS)) | #elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) | ||||||
|         return std::uncaught_exceptions() > 0; |         return std::uncaught_exceptions() > 0; | ||||||
| #else | #else | ||||||
|         return std::uncaught_exception(); |         return std::uncaught_exception(); | ||||||
|   | |||||||
							
								
								
									
										44
									
								
								src/catch2/internal/catch_config_uncaught_exceptions.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/catch2/internal/catch_config_uncaught_exceptions.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | |||||||
|  |  | ||||||
|  | //              Copyright Catch2 Authors | ||||||
|  | // Distributed under the Boost Software License, Version 1.0. | ||||||
|  | //   (See accompanying file LICENSE_1_0.txt or copy at | ||||||
|  | //        https://www.boost.org/LICENSE_1_0.txt) | ||||||
|  |  | ||||||
|  | // SPDX-License-Identifier: BSL-1.0 | ||||||
|  |  | ||||||
|  | /** \file | ||||||
|  |  * Wrapper for UNCAUGHT_EXCEPTIONS configuration option | ||||||
|  |  * | ||||||
|  |  * For some functionality, Catch2 requires to know whether there is | ||||||
|  |  * an active exception. Because `std::uncaught_exception` is deprecated | ||||||
|  |  * in C++17, we want to use `std::uncaught_exceptions` if possible. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP | ||||||
|  | #define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP | ||||||
|  |  | ||||||
|  | #if defined(_MSC_VER) | ||||||
|  | #  if _MSC_VER >= 1900 // Visual Studio 2015 or newer | ||||||
|  | #    define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS | ||||||
|  | #  endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <exception> | ||||||
|  |  | ||||||
|  | #if defined(__cpp_lib_uncaught_exceptions) \ | ||||||
|  |     && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) | ||||||
|  |  | ||||||
|  | #  define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS | ||||||
|  | #endif // __cpp_lib_uncaught_exceptions | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #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 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP | ||||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský