diff options
-rw-r--r-- | libcxx/include/memory | 5 | ||||
-rw-r--r-- | libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp | 4 |
2 files changed, 8 insertions, 1 deletions
diff --git a/libcxx/include/memory b/libcxx/include/memory index 03897b1c227..4c3a18c99a0 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -4073,7 +4073,10 @@ private: __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT { if (__e) - __e->__weak_this_ = *this; + { + __e->__weak_this_.__ptr_ = const_cast<_Yp*>(static_cast<const _Yp*>(__e)); + __e->__weak_this_.__cntrl_ = __cntrl_; + } } _LIBCPP_INLINE_VISIBILITY diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp index 58686d68c05..77af13fa90d 100644 --- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp @@ -34,6 +34,10 @@ struct Z : Y {}; int main() { + { // https://llvm.org/bugs/show_bug.cgi?id=18843 + std::shared_ptr<T const> t1(new T); + std::shared_ptr<T const> t2(std::make_shared<T>()); + } { std::shared_ptr<Y> p(new Z); std::shared_ptr<T> q = p->shared_from_this(); |