From 17cde19a0f8c939524295d27c3774186ac9a1d29 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 21 Dec 2017 19:39:42 -0800 Subject: Changes imported from Abseil "staging" branch: - f13b203bb87afd3a9330030fb97a1318083d8618 Fix SubstituteTest under C++17 with libc++. by Derek Mauro - c551cdf6f70afac3f8ca143f4837f2187715eea9 Fix ABSL_HAVE_THREAD_LOCAL macro for Apple platforms. by Abseil Team - 931020efc43c184c4124975f50a02b377d960f9d Add Abseil Compilers Guide by Tom Manshreck - 658f924ca7136c7994290955c5666b60da6ca5b9 Reimplement the SFINAE for allocator_traits::rebind to av... by Abseil Team - 4cb04fa739f70dd5ad0c8421ff4c444645136c7f Fix minor spelling error of 'returning'. by Abseil Team GitOrigin-RevId: f13b203bb87afd3a9330030fb97a1318083d8618 Change-Id: I8573087795a50f8cc8367b0af1aedfbd2a89a793 --- absl/memory/memory.h | 14 ++++++++++++-- absl/memory/memory_test.cc | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) (limited to 'absl/memory') diff --git a/absl/memory/memory.h b/absl/memory/memory.h index 22d44b9e..2220ee4e 100644 --- a/absl/memory/memory.h +++ b/absl/memory/memory.h @@ -319,13 +319,23 @@ struct RebindPtr>> { using type = typename T::template rebind; }; -template +template +constexpr bool HasRebindAlloc(...) { + return false; +} + +template +constexpr bool HasRebindAlloc(typename T::template rebind::other*) { + return true; +} + +template (nullptr)> struct RebindAlloc { using type = typename RebindFirstArg::type; }; template -struct RebindAlloc::other>> { +struct RebindAlloc { using type = typename T::template rebind::other; }; diff --git a/absl/memory/memory_test.cc b/absl/memory/memory_test.cc index 7d047ca0..dee9b486 100644 --- a/absl/memory/memory_test.cc +++ b/absl/memory/memory_test.cc @@ -438,6 +438,20 @@ TEST(AllocatorTraits, Typedefs) { absl::allocator_traits::is_always_equal>::value)); } +template +struct AllocWithPrivateInheritance : private std::allocator { + 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, + absl::allocator_traits>:: + rebind_alloc>::value)); +} + template struct Rebound {}; -- cgit v1.2.3