diff options
Diffstat (limited to 'test/std/utilities/memory')
26 files changed, 435 insertions, 31 deletions
diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.fail.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.fail.cpp new file mode 100644 index 000000000000..71201f0ef0d9 --- /dev/null +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.fail.cpp @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// template <class Alloc> +// struct allocator_traits +// { +// static pointer allocate(allocator_type& a, size_type n); +// ... +// }; + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 +// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8 + +#include <memory> +#include <cstdint> +#include <cassert> + +#include "test_macros.h" + +template <class T> +struct A +{ + typedef T value_type; + + value_type* allocate(std::size_t n) + { + assert(n == 12); + return reinterpret_cast<value_type*>(static_cast<std::uintptr_t>(0xEEADBEEF)); + } + value_type* allocate(std::size_t n, const void* p) + { + assert(n == 11); + assert(p == 0); + return reinterpret_cast<value_type*>(static_cast<std::uintptr_t>(0xFEADBEEF)); + } +}; + +int main() +{ + A<int> a; + std::allocator_traits<A<int> >::allocate(a, 10); // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}} + std::allocator_traits<A<int> >::allocate(a, 10, nullptr); // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}} +} diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.pass.cpp index ab8179c5ab4d..292d68de9786 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.pass.cpp @@ -20,6 +20,8 @@ #include <cstdint> #include <cassert> +#include "incomplete_type_helper.h" + template <class T> struct A { @@ -34,6 +36,14 @@ struct A int main() { + { A<int> a; assert(std::allocator_traits<A<int> >::allocate(a, 10) == reinterpret_cast<int*>(static_cast<std::uintptr_t>(0xDEADBEEF))); + } + { + typedef IncompleteHolder* VT; + typedef A<VT> Alloc; + Alloc a; + assert(std::allocator_traits<Alloc >::allocate(a, 10) == reinterpret_cast<VT*>(static_cast<std::uintptr_t>(0xDEADBEEF))); + } } diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_hint.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_hint.pass.cpp index 808284261f7d..90a9154e1840 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_hint.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_hint.pass.cpp @@ -21,6 +21,7 @@ #include <cassert> #include "test_macros.h" +#include "incomplete_type_helper.h" template <class T> struct A @@ -52,12 +53,29 @@ struct B } }; + int main() { #if TEST_STD_VER >= 11 + { A<int> a; assert(std::allocator_traits<A<int> >::allocate(a, 10, nullptr) == reinterpret_cast<int*>(static_cast<std::uintptr_t>(0xDEADBEEF))); + } + { + typedef IncompleteHolder* VT; + typedef A<VT> Alloc; + Alloc a; + assert(std::allocator_traits<Alloc >::allocate(a, 10, nullptr) == reinterpret_cast<VT*>(static_cast<std::uintptr_t>(0xDEADBEEF))); + } #endif + { B<int> b; assert(std::allocator_traits<B<int> >::allocate(b, 11, nullptr) == reinterpret_cast<int*>(static_cast<std::uintptr_t>(0xFEADBEEF))); + } + { + typedef IncompleteHolder* VT; + typedef B<VT> Alloc; + Alloc b; + assert(std::allocator_traits<Alloc >::allocate(b, 11, nullptr) == reinterpret_cast<VT*>(static_cast<std::uintptr_t>(0xFEADBEEF))); + } } diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp index 46075f62c6c1..e4aceffdd6b6 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp @@ -23,6 +23,7 @@ #include <cassert> #include "test_macros.h" +#include "incomplete_type_helper.h" template <class T> struct A @@ -107,6 +108,13 @@ int main() std::allocator_traits<A<int> >::construct(a, (A2*)&a2, 'd', 5); assert(A2::count == 1); } + { + typedef IncompleteHolder* VT; + typedef A<VT> Alloc; + Alloc a; + std::aligned_storage<sizeof(VT)>::type store; + std::allocator_traits<Alloc>::construct(a, (VT*)&store, nullptr); + } #if TEST_STD_VER >= 11 { A0::count = 0; diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/deallocate.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/deallocate.pass.cpp index 8176d8b3767a..ecb67adb58e9 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/deallocate.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/deallocate.pass.cpp @@ -20,6 +20,8 @@ #include <cstdint> #include <cassert> +#include "incomplete_type_helper.h" + int called = 0; template <class T> @@ -37,7 +39,17 @@ struct A int main() { + { A<int> a; std::allocator_traits<A<int> >::deallocate(a, reinterpret_cast<int*>(static_cast<std::uintptr_t>(0xDEADBEEF)), 10); assert(called == 1); + } + called = 0; + { + typedef IncompleteHolder* VT; + typedef A<VT> Alloc; + Alloc a; + std::allocator_traits<Alloc >::deallocate(a, reinterpret_cast<VT*>(static_cast<std::uintptr_t>(0xDEADBEEF)), 10); + assert(called == 1); + } } diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/destroy.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/destroy.pass.cpp index 2ee64b8b4a07..1a812876bf0c 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/destroy.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/destroy.pass.cpp @@ -23,6 +23,7 @@ #include <cassert> #include "test_macros.h" +#include "incomplete_type_helper.h" template <class T> struct A @@ -65,6 +66,13 @@ int main() std::allocator_traits<A<int> >::destroy(a, (A0*)&a0); assert(A0::count == 1); } + { + typedef IncompleteHolder* VT; + typedef A<VT> Alloc; + Alloc a; + std::aligned_storage<sizeof(VT)>::type store; + std::allocator_traits<Alloc>::destroy(a, (VT*)&store); + } #if TEST_STD_VER >= 11 { A0::count = 0; diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/incomplete_type_helper.h b/test/std/utilities/memory/allocator.traits/allocator.traits.members/incomplete_type_helper.h new file mode 100644 index 000000000000..7662338d73c4 --- /dev/null +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/incomplete_type_helper.h @@ -0,0 +1,14 @@ +#ifndef TEST_INCOMPLETE_TYPE_HELPER_H +#define TEST_INCOMPLETE_TYPE_HELPER_H + +#include "min_allocator.h" + +namespace NS { + struct Incomplete; +} + +template <class T> struct Holder { T value; }; + +typedef Holder<NS::Incomplete> IncompleteHolder; + +#endif diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/max_size.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/max_size.pass.cpp index d2c9a9826e14..12c0d02227fa 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/max_size.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/max_size.pass.cpp @@ -22,6 +22,7 @@ #include <cassert> #include "test_macros.h" +#include "incomplete_type_helper.h" template <class T> struct A @@ -51,6 +52,12 @@ int main() const B<int> b = {}; assert(std::allocator_traits<B<int> >::max_size(b) == 100); } + { + typedef IncompleteHolder* VT; + typedef B<VT> Alloc; + Alloc a; + assert(std::allocator_traits<Alloc >::max_size(a) == 100); + } #if TEST_STD_VER >= 11 { A<int> a; diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.members/select_on_container_copy_construction.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.members/select_on_container_copy_construction.pass.cpp index 2e9703037894..8355db18276a 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.members/select_on_container_copy_construction.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.members/select_on_container_copy_construction.pass.cpp @@ -23,6 +23,7 @@ #include <cassert> #include "test_macros.h" +#include "incomplete_type_helper.h" template <class T> struct A @@ -57,6 +58,12 @@ int main() const A<int> a(0); assert(std::allocator_traits<A<int> >::select_on_container_copy_construction(a).id == 0); } + { + typedef IncompleteHolder* VT; + typedef A<VT> Alloc; + Alloc a; + assert(std::allocator_traits<Alloc>::select_on_container_copy_construction(a).id == 0); + } #if TEST_STD_VER >= 11 { B<int> b; diff --git a/test/std/utilities/memory/allocator.traits/allocator.traits.types/is_always_equal.pass.cpp b/test/std/utilities/memory/allocator.traits/allocator.traits.types/is_always_equal.pass.cpp index 31a0f171d33d..7f7b155c35c8 100644 --- a/test/std/utilities/memory/allocator.traits/allocator.traits.types/is_always_equal.pass.cpp +++ b/test/std/utilities/memory/allocator.traits/allocator.traits.types/is_always_equal.pass.cpp @@ -37,7 +37,7 @@ template <class T> struct C { typedef T value_type; - int not_empty_; // some random member variable + int not_empty_; // some random member variable }; int main() diff --git a/test/std/utilities/memory/default.allocator/allocator.members/allocate.fail.cpp b/test/std/utilities/memory/default.allocator/allocator.members/allocate.fail.cpp new file mode 100644 index 000000000000..490309eddd6e --- /dev/null +++ b/test/std/utilities/memory/default.allocator/allocator.members/allocate.fail.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// allocator: +// pointer allocate(size_type n, allocator<void>::const_pointer hint=0); + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 +// UNSUPPORTED: clang-3.3, clang-3.4, clang-3.5, clang-3.6, clang-3.7, clang-3.8 + +#include <memory> +#include <cassert> + +#include "test_macros.h" + +int main() +{ + std::allocator<int> a; + a.allocate(3); // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}} + a.allocate(3, nullptr); // expected-error {{ignoring return value of function declared with 'nodiscard' attribute}} +} diff --git a/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp b/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp index 768d41878437..34cbb8dc5377 100644 --- a/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp +++ b/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp @@ -23,7 +23,7 @@ void test_max(size_t count) { std::allocator<T> a; try { - a.allocate(count); + TEST_IGNORE_NODISCARD a.allocate(count); assert(false); } catch (const std::exception &) { } diff --git a/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp b/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp new file mode 100644 index 000000000000..64a5c73affe1 --- /dev/null +++ b/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp @@ -0,0 +1,120 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +// template <class T> constexpr T* to_address(T* p) noexcept; +// template <class Ptr> auto to_address(const Ptr& p) noexcept; + +#include <memory> +#include <cassert> +#include "test_macros.h" + +class P1 +{ +public: + using element_type = int; + + explicit P1(int* p) + : p_(p) { } + + int* operator->() const noexcept + { return p_; } + +private: + int* p_; +}; + +class P2 +{ +public: + using element_type = int; + + explicit P2(int* p) + : p_(p) { } + + P1 operator->() const noexcept + { return p_; } + +private: + P1 p_; +}; + +class P3 +{ +public: + explicit P3(int* p) + : p_(p) { } + + int* get() const noexcept + { return p_; } + +private: + int* p_; +}; + +namespace std +{ +template<> +struct pointer_traits<::P3> +{ + static int* to_address(const ::P3& p) noexcept + { return p.get(); } +}; +} + +class P4 +{ +public: + explicit P4(int* p) + : p_(p) { } + + int* operator->() const noexcept + { return nullptr; } + + int* get() const noexcept + { return p_; } + +private: + int* p_; +}; + +namespace std +{ +template<> +struct pointer_traits<::P4> +{ + static int* to_address(const ::P4& p) noexcept + { return p.get(); } +}; +} + +int n = 0; +static_assert(std::to_address(&n) == &n); + +int main() +{ + int i = 0; + ASSERT_NOEXCEPT(std::to_address(&i)); + assert(std::to_address(&i) == &i); + P1 p1(&i); + ASSERT_NOEXCEPT(std::to_address(p1)); + assert(std::to_address(p1) == &i); + P2 p2(&i); + ASSERT_NOEXCEPT(std::to_address(p2)); + assert(std::to_address(p2) == &i); + P3 p3(&i); + ASSERT_NOEXCEPT(std::to_address(p3)); + assert(std::to_address(p3) == &i); + P4 p4(&i); + ASSERT_NOEXCEPT(std::to_address(p4)); + assert(std::to_address(p4) == &i); +} diff --git a/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp b/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp index 81f49eaac39b..3ff32df11338 100644 --- a/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp +++ b/test/std/utilities/memory/specialized.algorithms/specialized.addressof/addressof.temp.fail.cpp @@ -19,7 +19,7 @@ int main() { #if TEST_STD_VER > 14 - const int *p = std::addressof<const int>(0); + const int *p = std::addressof<const int>(0); #else #error #endif diff --git a/test/std/utilities/memory/specialized.algorithms/uninitialized.construct.value/uninitialized_value_construct_n.pass.cpp b/test/std/utilities/memory/specialized.algorithms/uninitialized.construct.value/uninitialized_value_construct_n.pass.cpp index ad6a51500e36..319df229668f 100644 --- a/test/std/utilities/memory/specialized.algorithms/uninitialized.construct.value/uninitialized_value_construct_n.pass.cpp +++ b/test/std/utilities/memory/specialized.algorithms/uninitialized.construct.value/uninitialized_value_construct_n.pass.cpp @@ -112,4 +112,4 @@ int main() { test_counted(); test_value_initialized(); -}
\ No newline at end of file +} diff --git a/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp b/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp index 1829dff354d3..2f387a4cef97 100644 --- a/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp +++ b/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp @@ -71,7 +71,7 @@ int main() std::uninitialized_copy(b, b+2, bp); for (int i = 0; i < 2; ++i) assert(bp[i].data_ == 1); - assert(B::population_ == N + 2); + assert(B::population_ == N + 2); } { diff --git a/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move.pass.cpp b/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move.pass.cpp index 6c535250fd1f..d914129f2a4a 100644 --- a/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move.pass.cpp +++ b/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move.pass.cpp @@ -111,4 +111,4 @@ void test_counted() int main() { test_counted(); test_ctor_throws(); -}
\ No newline at end of file +} diff --git a/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move_n.pass.cpp b/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move_n.pass.cpp index 4175c6bce688..4083bc367cf2 100644 --- a/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move_n.pass.cpp +++ b/test/std/utilities/memory/specialized.algorithms/uninitialized.move/uninitialized_move_n.pass.cpp @@ -114,4 +114,4 @@ int main() { test_counted(); test_ctor_throws(); -}
\ No newline at end of file +} diff --git a/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.fail.cpp b/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.fail.cpp new file mode 100644 index 000000000000..48c90f7b9661 --- /dev/null +++ b/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.fail.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03 +// Because we don't have a functioning decltype in C++03 + +// <memory> + +// unique_ptr + +// template<class CharT, class Traits, class Y, class D> +// basic_ostream<CharT, Traits>& +// operator<<(basic_ostream<CharT, Traits>& os, const unique_ptr<Y, D>& p); + +// -?- Remarks: This function shall not participate in overload resolution unless os << p.get() is a valid expression. + +#include <memory> +#include <sstream> +#include <cassert> + +class A {}; + +int main() +{ + std::unique_ptr<A> p(new A); + std::ostringstream os; + os << p; +} diff --git a/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.pass.cpp b/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.pass.cpp new file mode 100644 index 000000000000..1166a01e8198 --- /dev/null +++ b/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03 +// Because we don't have a functioning decltype in C++03 + +// <memory> + +// unique_ptr + +// template<class CharT, class Traits, class Y, class D> +// basic_ostream<CharT, Traits>& +// operator<<(basic_ostream<CharT, Traits>& os, const unique_ptr<Y, D>& p); + +#include <memory> +#include <sstream> +#include <cassert> + +int main() +{ + std::unique_ptr<int> p(new int(3)); + std::ostringstream os; + assert(os.str().empty()); + os << p; + assert(!os.str().empty()); +} diff --git a/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp b/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp index eb0d0a955fc5..8bd8993e5bec 100644 --- a/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp +++ b/test/std/utilities/memory/util.smartptr/util.smartptr.enab/enable_shared_from_this.pass.cpp @@ -41,7 +41,7 @@ void nullDeleter(void*) {} struct Foo : virtual public std::enable_shared_from_this<Foo> { - virtual ~Foo() {} + virtual ~Foo() {} }; struct Bar : public Foo { @@ -80,12 +80,11 @@ int main() } { typedef std::shared_ptr<PrivateBase> APtr; - typedef std::weak_ptr<PrivateBase> WeakAPtr; APtr a1 = std::make_shared<PrivateBase>(); assert(a1.use_count() == 1); } // Test LWG issue 2529. Only reset '__weak_ptr_' when it's already expired. - // http://cplusplus.github.io/LWG/lwg-active.html#2529. + // https://cplusplus.github.io/LWG/lwg-defects.html#2529 // Test two different ways: // * Using 'weak_from_this().expired()' in C++17. // * Using 'shared_from_this()' in all dialects. @@ -135,7 +134,7 @@ int main() #ifndef TEST_HAS_NO_EXCEPTIONS try { - ptr->shared_from_this(); + TEST_IGNORE_NODISCARD ptr->shared_from_this(); assert(false); } catch (std::bad_weak_ptr const&) { } catch (...) { assert(false); } diff --git a/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.private.fail.cpp b/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.private.fail.cpp new file mode 100644 index 000000000000..7f304054bda0 --- /dev/null +++ b/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.private.fail.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// shared_ptr + +// template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); + +#include <memory> +#include <cassert> + +#include "test_macros.h" + +struct S { +private: + S () {}; // ctor is private +}; + +int main() +{ + std::shared_ptr<S> p = std::make_shared<S>(); +} diff --git a/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.protected.fail.cpp b/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.protected.fail.cpp new file mode 100644 index 000000000000..0eeeed4e88c9 --- /dev/null +++ b/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/make_shared.protected.fail.cpp @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <memory> + +// shared_ptr + +// template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args); + +#include <memory> +#include <cassert> + +#include "test_macros.h" + +struct S { +protected: + S () {}; // ctor is protected +}; + +int main() +{ + std::shared_ptr<S> p = std::make_shared<S>(); // expected-error-re@memory:* {{static_assert failed{{.*}} "Can't construct object in make_shared"}} +} diff --git a/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.ownerless/owner_less.pass.cpp b/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.ownerless/owner_less.pass.cpp index 501844a1d6ce..b7ea8d4dc6d3 100644 --- a/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.ownerless/owner_less.pass.cpp +++ b/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.ownerless/owner_less.pass.cpp @@ -74,14 +74,14 @@ int main() assert(!cs(p2, p1)); assert(cs(p1 ,p3) || cs(p3, p1)); assert(cs(p3, p1) == cs(p3, p2)); - ASSERT_NOEXCEPT(cs(p1, p1)); + ASSERT_NOEXCEPT(cs(p1, p1)); assert(!cs(p1, w2)); assert(!cs(p2, w1)); assert(cs(p1, w3) || cs(p3, w1)); assert(cs(p3, w1) == cs(p3, w2)); - ASSERT_NOEXCEPT(cs(p1, w1)); - ASSERT_NOEXCEPT(cs(w1, p1)); + ASSERT_NOEXCEPT(cs(p1, w1)); + ASSERT_NOEXCEPT(cs(w1, p1)); } { typedef std::owner_less<std::weak_ptr<int> > CS; @@ -95,14 +95,14 @@ int main() assert(!cs(w2, w1)); assert(cs(w1, w3) || cs(w3, w1)); assert(cs(w3, w1) == cs(w3, w2)); - ASSERT_NOEXCEPT(cs(w1, w1)); + ASSERT_NOEXCEPT(cs(w1, w1)); assert(!cs(w1, p2)); assert(!cs(w2, p1)); assert(cs(w1, p3) || cs(w3, p1)); assert(cs(w3, p1) == cs(w3, p2)); - ASSERT_NOEXCEPT(cs(w1, p1)); - ASSERT_NOEXCEPT(cs(p1, w1)); + ASSERT_NOEXCEPT(cs(w1, p1)); + ASSERT_NOEXCEPT(cs(p1, w1)); } #if TEST_STD_VER > 14 { @@ -112,21 +112,21 @@ int main() std::weak_ptr<int> wp1; std::owner_less<> cmp; - cmp(sp1, sp2); - cmp(sp1, wp1); - cmp(sp1, sp3); - cmp(wp1, sp1); - cmp(wp1, wp1); - ASSERT_NOEXCEPT(cmp(sp1, sp1)); - ASSERT_NOEXCEPT(cmp(sp1, wp1)); - ASSERT_NOEXCEPT(cmp(wp1, sp1)); - ASSERT_NOEXCEPT(cmp(wp1, wp1)); + assert(!cmp(sp1, sp2)); + assert(!cmp(sp1, wp1)); + assert(!cmp(sp1, sp3)); + assert(!cmp(wp1, sp1)); + assert(!cmp(wp1, wp1)); + ASSERT_NOEXCEPT(cmp(sp1, sp1)); + ASSERT_NOEXCEPT(cmp(sp1, wp1)); + ASSERT_NOEXCEPT(cmp(wp1, sp1)); + ASSERT_NOEXCEPT(cmp(wp1, wp1)); } { // test heterogeneous lookups std::set<std::shared_ptr<X>, std::owner_less<>> s; std::shared_ptr<void> vp; - s.find(vp); + assert(s.find(vp) == s.end()); } #endif } diff --git a/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_shared_ptr.pass.cpp b/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_shared_ptr.pass.cpp index 458f8a11ed12..23df0d8e68ed 100644 --- a/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_shared_ptr.pass.cpp +++ b/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_shared_ptr.pass.cpp @@ -29,6 +29,5 @@ int main() assert(!w2.owner_before(p1)); assert(w1.owner_before(p3) || w3.owner_before(p1)); assert(w3.owner_before(p1) == w3.owner_before(p2)); -// change to 'ASSERT_NOEXCEPT' when LWG2942 is adopted - LIBCPP_ASSERT_NOEXCEPT(w1.owner_before(p2)); + ASSERT_NOEXCEPT(w1.owner_before(p2)); } diff --git a/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_weak_ptr.pass.cpp b/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_weak_ptr.pass.cpp index 5cd171a53021..a38bf67c2e03 100644 --- a/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_weak_ptr.pass.cpp +++ b/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.obs/owner_before_weak_ptr.pass.cpp @@ -29,6 +29,5 @@ int main() assert(!w2.owner_before(w1)); assert(w1.owner_before(w3) || w3.owner_before(w1)); assert(w3.owner_before(w1) == w3.owner_before(w2)); -// change to 'ASSERT_NOEXCEPT' when LWG2942 is adopted - LIBCPP_ASSERT_NOEXCEPT(w1.owner_before(w2)); + ASSERT_NOEXCEPT(w1.owner_before(w2)); } |
