about summary refs log tree commit diff
path: root/absl/memory
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2017-12-22T03·39-0800
committerXiaoyi Zhang <zhangxy988@gmail.com>2017-12-22T20·08-0500
commit17cde19a0f8c939524295d27c3774186ac9a1d29 (patch)
tree5e10511803413133dc4b0a6b85663a624ea5e9e0 /absl/memory
parentff7045647330f5dc21725a42456091207f3eecd5 (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.h14
-rw-r--r--absl/memory/memory_test.cc14
2 files changed, 26 insertions, 2 deletions
diff --git a/absl/memory/memory.h b/absl/memory/memory.h
index 22d44b9e46fe..2220ee4e412f 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 7d047ca0c726..dee9b486a30d 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 {