diff options
author | Neil MacIntosh <neilmac@microsoft.com> | 2016-09-13 12:19:19 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-13 12:19:19 -0700 |
commit | 6bc1e7e709060528a7969e0bc8bd10960594f6b2 (patch) | |
tree | a6be21b3b27c79e384942ad3ca4b57df079727e0 | |
parent | e40729a561b208429d9298ee60f5a4945c096c99 (diff) | |
parent | bc70a93bba6c6f63486df55295145d043604a228 (diff) | |
download | platform_external_Microsoft-GSL-6bc1e7e709060528a7969e0bc8bd10960594f6b2.tar.gz platform_external_Microsoft-GSL-6bc1e7e709060528a7969e0bc8bd10960594f6b2.tar.bz2 platform_external_Microsoft-GSL-6bc1e7e709060528a7969e0bc8bd10960594f6b2.zip |
Fix for #313 Corrected SFINAE for conversion constructors on span
-rw-r--r-- | gsl/span | 35 | ||||
-rw-r--r-- | tests/span_tests.cpp | 18 |
2 files changed, 12 insertions, 41 deletions
@@ -123,23 +123,6 @@ namespace details { }; - template <class From, class To> - struct is_allowed_pointer_conversion - : public std::integral_constant<bool, std::is_pointer<From>::value && - std::is_pointer<To>::value && - std::is_convertible<From, To>::value> - { - }; - - template <class From, class To> - struct is_allowed_integral_conversion - : public std::integral_constant< - bool, std::is_integral<From>::value && std::is_integral<To>::value && - sizeof(From) == sizeof(To) && alignof(From) == alignof(To) && - std::is_convertible<From, To>::value> - { - }; - template <std::ptrdiff_t From, std::ptrdiff_t To> struct is_allowed_extent_conversion : public std::integral_constant<bool, From == To || From == gsl::dynamic_extent || @@ -150,19 +133,7 @@ namespace details template <class From, class To> struct is_allowed_element_type_conversion : public std::integral_constant<bool, std::is_same<From, std::remove_cv_t<To>>::value || - is_allowed_pointer_conversion<From, To>::value || - is_allowed_integral_conversion<From, To>::value> - { - }; - - template <class From> - struct is_allowed_element_type_conversion<From, byte> - : public std::integral_constant<bool, !std::is_const<From>::value> - { - }; - - template <class From> - struct is_allowed_element_type_conversion<From, const byte> : public std::true_type + std::is_convertible<From(*)[], To(*)[]>::value> { }; @@ -449,7 +420,7 @@ public: details::is_allowed_extent_conversion<OtherExtent, Extent>::value && details::is_allowed_element_type_conversion<OtherElementType, element_type>::value>> constexpr span(const span<OtherElementType, OtherExtent>& other) - : storage_(reinterpret_cast<pointer>(other.data()), + : storage_(static_cast<pointer>(other.data()), details::extent_type<OtherExtent>(other.size())) { } @@ -460,7 +431,7 @@ public: details::is_allowed_extent_conversion<OtherExtent, Extent>::value && details::is_allowed_element_type_conversion<OtherElementType, element_type>::value>> constexpr span(span<OtherElementType, OtherExtent>&& other) - : storage_(reinterpret_cast<pointer>(other.data()), + : storage_(static_cast<pointer>(other.data()), details::extent_type<OtherExtent>(other.size())) { } diff --git a/tests/span_tests.cpp b/tests/span_tests.cpp index 571a821..a1dd64d 100644 --- a/tests/span_tests.cpp +++ b/tests/span_tests.cpp @@ -423,6 +423,7 @@ SUITE(span_tests) span<const int, 4> s{arr}; CHECK(s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data()); } + #ifdef CONFIRM_COMPILATION_ERRORS { span<const int, 2> s{arr}; @@ -437,6 +438,7 @@ SUITE(span_tests) { span<const int, 5> s{arr}; } +#endif { auto get_an_array = []() -> const std::array<int, 4> { return {1, 2, 3, 4}; }; @@ -444,7 +446,6 @@ SUITE(span_tests) // try to take a temporary std::array take_a_span(get_an_array()); } -#endif } TEST(from_std_array_const_constructor) @@ -460,6 +461,7 @@ SUITE(span_tests) span<const int, 4> s{arr}; CHECK(s.size() == narrow_cast<ptrdiff_t>(arr.size()) && s.data() == arr.data()); } + #ifdef CONFIRM_COMPILATION_ERRORS { span<const int, 2> s{arr}; @@ -509,7 +511,7 @@ SUITE(span_tests) { #ifdef CONFIRM_COMPILATION_ERRORS span<char> s{cstr}; -#endif +#endif span<const char> cs{cstr}; CHECK(cs.size() == narrow_cast<std::ptrdiff_t>(cstr.size()) && cs.data() == cstr.data()); @@ -520,7 +522,7 @@ SUITE(span_tests) auto get_temp_vector = []() -> std::vector<int> { return {}; }; auto use_span = [](span<int> s) { static_cast<void>(s); }; use_span(get_temp_vector()); -#endif +#endif } { @@ -534,7 +536,7 @@ SUITE(span_tests) auto get_temp_string = []() -> std::string { return{}; }; auto use_span = [](span<char> s) { static_cast<void>(s); }; use_span(get_temp_string()); -#endif +#endif } { @@ -552,11 +554,9 @@ SUITE(span_tests) } { -#ifdef CONFIRM_COMPILATION_ERRORS auto get_temp_string = []() -> const std::string { return {}; }; auto use_span = [](span<const char> s) { static_cast<void>(s); }; use_span(get_temp_string()); -#endif } { @@ -583,6 +583,7 @@ SUITE(span_tests) #endif } +#ifdef CONFIRM_COMPILATION_ERRORS { span<int> s; span<unsigned int> s2 = s; @@ -596,12 +597,11 @@ SUITE(span_tests) } { -#ifdef CONFIRM_COMPILATION_ERRORS span<int> s; span<short> s2 = s; static_cast<void>(s2); -#endif } +#endif } TEST(copy_move_and_assignment) @@ -689,7 +689,7 @@ SUITE(span_tests) span<int, 5> av = arr; #ifdef CONFIRM_COMPILATION_ERRORS CHECK(av.last<6>().length() == 6); -#endif +#endif CHECK_THROW(av.last(6).length(), fail_fast); } |