From 263a0f7681825915b933c5941cf772bba2e8aee2 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Wed, 27 May 2015 20:15:33 +0000 Subject: [PATCH] Fix PR#23647 - make_shared llvm-svn: 238354 --- libcxx/include/memory | 4 +- .../make_shared.volatile.pass.cpp | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.volatile.pass.cpp diff --git a/libcxx/include/memory b/libcxx/include/memory index 4af72c3da0fe..8dbc4cb90392 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -4040,14 +4040,14 @@ private: template _LIBCPP_INLINE_VISIBILITY void - __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT + __enable_weak_this(const volatile enable_shared_from_this<_Yp>* __e) _NOEXCEPT { if (__e) __e->__weak_this_ = *this; } _LIBCPP_INLINE_VISIBILITY - void __enable_weak_this(const void*) _NOEXCEPT {} + void __enable_weak_this(const volatile void*) _NOEXCEPT {} template friend class _LIBCPP_TYPE_VIS_ONLY shared_ptr; template friend class _LIBCPP_TYPE_VIS_ONLY weak_ptr; diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.volatile.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.volatile.pass.cpp new file mode 100644 index 000000000000..1045f9347b38 --- /dev/null +++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.volatile.pass.cpp @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// shared_ptr + +// template shared_ptr make_shared(Args&&... args); + +#include +#include + +template +void test(const T &t0) +{ + { + T t1 = t0; + std::shared_ptr p0 = std::make_shared(t0); + std::shared_ptr p1 = std::make_shared(t1); + assert(*p0 == t0); + assert(*p1 == t1); + } + + { + const T t1 = t0; + std::shared_ptr p0 = std::make_shared(t0); + std::shared_ptr p1 = std::make_shared(t1); + assert(*p0 == t0); + assert(*p1 == t1); + } + + { + volatile T t1 = t0; + std::shared_ptr p0 = std::make_shared(t0); + std::shared_ptr p1 = std::make_shared(t1); + assert(*p0 == t0); + assert(*p1 == t1); + } + + { + const volatile T t1 = t0; + std::shared_ptr p0 = std::make_shared(t0); + std::shared_ptr p1 = std::make_shared(t1); + assert(*p0 == t0); + assert(*p1 == t1); + } + +} + +int main() +{ + test(true); + test(3); + test(5.0); +}