[libcxx-commits] [libcxx] 092a57f - [libc++] Fix unqualified call to 'ref' inside shared_ptr(unique_ptr<U, D>)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Feb 20 09:26:35 PST 2020
Author: Logan Smith
Date: 2020-02-20T12:24:40-05:00
New Revision: 092a57f5082146b6770f89839666b7545a0d27f0
URL: https://github.com/llvm/llvm-project/commit/092a57f5082146b6770f89839666b7545a0d27f0
DIFF: https://github.com/llvm/llvm-project/commit/092a57f5082146b6770f89839666b7545a0d27f0.diff
LOG: [libc++] Fix unqualified call to 'ref' inside shared_ptr(unique_ptr<U, D>)
This prevents unintended ADL: https://gcc.godbolt.org/z/EHw3Gy
This issue was mentioned as an addendum in PR44398.
Differential Revision: https://reviews.llvm.org/D74289
Added:
Modified:
libcxx/include/memory
libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/include/memory b/libcxx/include/memory
index 821f371eb0b0..4610bfe8dc43 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -4174,7 +4174,7 @@ shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r,
typedef __shared_ptr_pointer<_Yp*,
reference_wrapper<typename remove_reference<_Dp>::type>,
_AllocT > _CntrlBlk;
- __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), _AllocT());
+ __cntrl_ = new _CntrlBlk(__r.get(), _VSTD::ref(__r.get_deleter()), _AllocT());
__enable_weak_this(__r.get(), __r.get());
}
__r.release();
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
index 41e64c6b431d..91716fca0574 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
@@ -49,6 +49,13 @@ void fn ( const std::shared_ptr<B> &) { assert (false); }
template <typename T>
void assert_deleter ( T * ) { assert(false); }
+namespace adl {
+struct D {
+ void operator()(int *) const {}
+};
+void ref(D);
+}
+
int main(int, char**)
{
{
@@ -98,5 +105,11 @@ int main(int, char**)
}
#endif
+ {
+ adl::D d;
+ std::unique_ptr<int, adl::D&> u(nullptr, d);
+ std::shared_ptr<int> s = std::move(u);
+ }
+
return 0;
}
More information about the libcxx-commits
mailing list