diff options
author | Abseil Team <absl-team@google.com> | 2017-12-21 19:39:42 -0800 |
---|---|---|
committer | Xiaoyi Zhang <zhangxy988@gmail.com> | 2017-12-22 15:08:21 -0500 |
commit | 17cde19a0f8c939524295d27c3774186ac9a1d29 (patch) | |
tree | 5e10511803413133dc4b0a6b85663a624ea5e9e0 /absl/memory | |
parent | ff7045647330f5dc21725a42456091207f3eecd5 (diff) |
Changes imported from Abseil "staging" branch:
- f13b203bb87afd3a9330030fb97a1318083d8618 Fix SubstituteTest under C++17 with libc++. by Derek Mauro <dmauro@google.com>
- c551cdf6f70afac3f8ca143f4837f2187715eea9 Fix ABSL_HAVE_THREAD_LOCAL macro for Apple platforms. by Abseil Team <absl-team@google.com>
- 931020efc43c184c4124975f50a02b377d960f9d Add Abseil Compilers Guide by Tom Manshreck <shreck@google.com>
- 658f924ca7136c7994290955c5666b60da6ca5b9 Reimplement the SFINAE for allocator_traits::rebind to av... by Abseil Team <absl-team@google.com>
- 4cb04fa739f70dd5ad0c8421ff4c444645136c7f Fix minor spelling error of 'returning'. by Abseil Team <absl-team@google.com>
GitOrigin-RevId: f13b203bb87afd3a9330030fb97a1318083d8618
Change-Id: I8573087795a50f8cc8367b0af1aedfbd2a89a793
Diffstat (limited to 'absl/memory')
-rw-r--r-- | absl/memory/memory.h | 14 | ||||
-rw-r--r-- | absl/memory/memory_test.cc | 14 |
2 files changed, 26 insertions, 2 deletions
diff --git a/absl/memory/memory.h b/absl/memory/memory.h index 22d44b9..2220ee4 100644 --- a/absl/memory/memory.h +++ b/absl/memory/memory.h @@ -319,13 +319,23 @@ struct RebindPtr<T, U, void_t<typename T::template rebind<U>>> { using type = typename T::template rebind<U>; }; -template <typename T, typename U, typename = void> +template <typename T, typename U> +constexpr bool HasRebindAlloc(...) { + return false; +} + +template <typename T, typename U> +constexpr bool HasRebindAlloc(typename T::template rebind<U>::other*) { + return true; +} + +template <typename T, typename U, bool = HasRebindAlloc<T, U>(nullptr)> struct RebindAlloc { using type = typename RebindFirstArg<T, U>::type; }; template <typename T, typename U> -struct RebindAlloc<T, U, void_t<typename T::template rebind<U>::other>> { +struct RebindAlloc<T, U, true> { using type = typename T::template rebind<U>::other; }; diff --git a/absl/memory/memory_test.cc b/absl/memory/memory_test.cc index 7d047ca..dee9b48 100644 --- a/absl/memory/memory_test.cc +++ b/absl/memory/memory_test.cc @@ -439,6 +439,20 @@ TEST(AllocatorTraits, Typedefs) { } template <typename T> +struct AllocWithPrivateInheritance : private std::allocator<T> { + using value_type = T; +}; + +TEST(AllocatorTraits, RebindWithPrivateInheritance) { + // Regression test for some versions of gcc that do not like the sfinae we + // used in combination with private inheritance. + EXPECT_TRUE( + (std::is_same<AllocWithPrivateInheritance<int>, + absl::allocator_traits<AllocWithPrivateInheritance<char>>:: + rebind_alloc<int>>::value)); +} + +template <typename T> struct Rebound {}; struct AllocWithRebind { |