diff options
author | Rajveer Singh Bharadwaj <rajveer.developer@icloud.com> | 2024-02-05 22:11:36 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-05 11:41:36 -0500 |
commit | 341d3a59999dec56f51804a5356b2e38256ab55c (patch) | |
tree | 0ef0c34c621f7d161ff4dfc49e3b6656c482f7e6 | |
parent | 1ec252298925de50b27930c557ba9de3cc397afe (diff) | |
download | llvm-341d3a59999dec56f51804a5356b2e38256ab55c.zip llvm-341d3a59999dec56f51804a5356b2e38256ab55c.tar.gz llvm-341d3a59999dec56f51804a5356b2e38256ab55c.tar.bz2 |
[libc++] Fix ambiguity when using std::scoped_allocator constructor (#80261)
Fixes #78754
-rw-r--r-- | libcxx/include/scoped_allocator | 5 | ||||
-rw-r--r-- | libcxx/test/std/utilities/allocator.adaptor/allocator.adaptor.cnstr/allocs.pass.cpp | 9 |
2 files changed, 10 insertions, 4 deletions
diff --git a/libcxx/include/scoped_allocator b/libcxx/include/scoped_allocator index 6078906..1626453 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 a752dfd..1135ead 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; } |