[libcxx-commits] [libcxx] 341d3a5 - [libc++] Fix ambiguity when using std::scoped_allocator constructor (#80261)
via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Feb 5 08:41:40 PST 2024
Author: Rajveer Singh Bharadwaj
Date: 2024-02-05T11:41:36-05:00
New Revision: 341d3a59999dec56f51804a5356b2e38256ab55c
URL: https://github.com/llvm/llvm-project/commit/341d3a59999dec56f51804a5356b2e38256ab55c
DIFF: https://github.com/llvm/llvm-project/commit/341d3a59999dec56f51804a5356b2e38256ab55c.diff
LOG: [libc++] Fix ambiguity when using std::scoped_allocator constructor (#80261)
Fixes #78754
Added:
Modified:
libcxx/include/scoped_allocator
libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.cnstr/allocs.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/include/scoped_allocator b/libcxx/include/scoped_allocator
index 6078906e92248..1626453a698ff 100644
--- a/libcxx/include/scoped_allocator
+++ b/libcxx/include/scoped_allocator
@@ -476,9 +476,8 @@ public:
}
private:
- template <class _OuterA2, __enable_if_t<is_constructible<outer_allocator_type, _OuterA2>::value, int> = 0>
- _LIBCPP_HIDE_FROM_ABI scoped_allocator_adaptor(_OuterA2&& __o, const inner_allocator_type& __i) _NOEXCEPT
- : base(std::forward<_OuterA2>(__o), __i) {}
+ _LIBCPP_HIDE_FROM_ABI explicit scoped_allocator_adaptor(outer_allocator_type&& __o, inner_allocator_type&& __i) _NOEXCEPT
+ : base(std::move(__o), std::move(__i)) {}
template <class _Tp, class... _Args>
_LIBCPP_HIDE_FROM_ABI void __construct(integral_constant<int, 0>, _Tp* __p, _Args&&... __args) {
diff --git a/libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.cnstr/allocs.pass.cpp b/libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.cnstr/allocs.pass.cpp
index a752dfd029eff..1135eadbb95ff 100644
--- a/libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.cnstr/allocs.pass.cpp
+++ b/libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.cnstr/allocs.pass.cpp
@@ -104,13 +104,20 @@ int main(int, char**) {
assert(a.outer_allocator() == A1<int>(4));
assert((a.inner_allocator() == std::scoped_allocator_adaptor<A2<int>, A3<int>>(A2<int>(5), A3<int>(6))));
}
- // Test for LWG2782
{
+ // Test for LWG2782
static_assert(!std::is_convertible<A1<int>, A2<int>>::value, "");
static_assert(
!std::is_convertible< std::scoped_allocator_adaptor<A1<int>>, std::scoped_allocator_adaptor<A2<int>>>::value,
"");
}
+ {
+ // Test construction from convertible-to-allocator types (https://github.com/llvm/llvm-project/issues/78754)
+ typedef std::scoped_allocator_adaptor<A1<int>, A1<int>> A;
+ A a(A1<char>(4), A1<char>(5));
+ assert(a.outer_allocator() == A1<int>(4));
+ assert(a.inner_allocator() == A1<int>(5));
+ }
return 0;
}
More information about the libcxx-commits
mailing list