mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 05:59:32 +01:00 
			
		
		
		
	Fix compilation failure when using libstdc++10 (#1929)
The issue is caused by deleted `std::__detail::begin` declared in `bits/iterator_concepts.h`. This would be found by ADL, and because it is deleted, compilation would fail. This change makes it so that we SFINAE on `begin(std::declval<T>())` and `end(std::declval<T>())` being well-formed.
This commit is contained in:
		@@ -446,20 +446,27 @@ namespace Catch {
 | 
			
		||||
#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
 | 
			
		||||
 | 
			
		||||
namespace Catch {
 | 
			
		||||
    struct not_this_one {}; // Tag type for detecting which begin/ end are being selected
 | 
			
		||||
 | 
			
		||||
    // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace
 | 
			
		||||
    // Import begin/ end from std here
 | 
			
		||||
    using std::begin;
 | 
			
		||||
    using std::end;
 | 
			
		||||
 | 
			
		||||
    not_this_one begin( ... );
 | 
			
		||||
    not_this_one end( ... );
 | 
			
		||||
    namespace detail {
 | 
			
		||||
        template <typename...>
 | 
			
		||||
        struct void_type {
 | 
			
		||||
            using type = void;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        template <typename T, typename = void>
 | 
			
		||||
        struct is_range_impl : std::false_type {
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        template <typename T>
 | 
			
		||||
    struct is_range {
 | 
			
		||||
        static const bool value =
 | 
			
		||||
            !std::is_same<decltype(begin(std::declval<T>())), not_this_one>::value &&
 | 
			
		||||
            !std::is_same<decltype(end(std::declval<T>())), not_this_one>::value;
 | 
			
		||||
        struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type {
 | 
			
		||||
        };
 | 
			
		||||
    } // namespace detail
 | 
			
		||||
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    struct is_range : detail::is_range_impl<T> {
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
#if defined(_MANAGED) // Managed types are never ranges
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user