diff --git a/libcxx/include/__memory_resource/memory_resource.h b/libcxx/include/__memory_resource/memory_resource.h --- a/libcxx/include/__memory_resource/memory_resource.h +++ b/libcxx/include/__memory_resource/memory_resource.h @@ -32,11 +32,13 @@ public: virtual ~memory_resource() = default; - _LIBCPP_HIDE_FROM_ABI void* allocate(size_t __bytes, size_t __align = __max_align) { + [[using __gnu__: __returns_nonnull__, __alloc_size__(2), __alloc_align__(3)]] _LIBCPP_HIDE_FROM_ABI void* + allocate(size_t __bytes, size_t __align = __max_align) { return do_allocate(__bytes, __align); } - _LIBCPP_HIDE_FROM_ABI void deallocate(void* __p, size_t __bytes, size_t __align = __max_align) { + [[__gnu__::__nonnull__]] _LIBCPP_HIDE_FROM_ABI void + deallocate(void* __p, size_t __bytes, size_t __align = __max_align) { do_deallocate(__p, __bytes, __align); } @@ -61,13 +63,10 @@ // [mem.res.global] -_LIBCPP_FUNC_VIS memory_resource* get_default_resource() noexcept; - -_LIBCPP_FUNC_VIS memory_resource* set_default_resource(memory_resource*) noexcept; - -_LIBCPP_FUNC_VIS memory_resource* new_delete_resource() noexcept; - -_LIBCPP_FUNC_VIS memory_resource* null_memory_resource() noexcept; +[[__gnu__::__returns_nonnull__]] _LIBCPP_FUNC_VIS memory_resource* get_default_resource() noexcept; +[[__gnu__::__returns_nonnull__]] _LIBCPP_FUNC_VIS memory_resource* set_default_resource(memory_resource*) noexcept; +[[using __gnu__: __returns_nonnull__, __const__]] _LIBCPP_FUNC_VIS memory_resource* new_delete_resource() noexcept; +[[using __gnu__: __returns_nonnull__, __const__]] _LIBCPP_FUNC_VIS memory_resource* null_memory_resource() noexcept; } // namespace pmr diff --git a/libcxx/include/__memory_resource/unsynchronized_pool_resource.h b/libcxx/include/__memory_resource/unsynchronized_pool_resource.h --- a/libcxx/include/__memory_resource/unsynchronized_pool_resource.h +++ b/libcxx/include/__memory_resource/unsynchronized_pool_resource.h @@ -78,7 +78,7 @@ _LIBCPP_HIDE_FROM_ABI memory_resource* upstream_resource() const { return __res_; } - pool_options options() const; + [[__gnu__::__pure__]] pool_options options() const; protected: void* do_allocate(size_t __bytes, size_t __align) override; // key function diff --git a/libcxx/test/std/utilities/utility/mem.res/mem.res.global/null_memory_resource.pass.cpp b/libcxx/test/std/utilities/utility/mem.res/mem.res.global/null_memory_resource.pass.cpp --- a/libcxx/test/std/utilities/utility/mem.res/mem.res.global/null_memory_resource.pass.cpp +++ b/libcxx/test/std/utilities/utility/mem.res/mem.res.global/null_memory_resource.pass.cpp @@ -90,7 +90,6 @@ globalMemCounter.reset(); int x = 42; - std::pmr::null_memory_resource()->deallocate(nullptr, 0); std::pmr::null_memory_resource()->deallocate(&x, 0); assert(globalMemCounter.checkDeleteCalledEq(0)); diff --git a/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/allocate.pass.cpp b/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/allocate.pass.cpp --- a/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/allocate.pass.cpp +++ b/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/allocate.pass.cpp @@ -37,11 +37,11 @@ auto& P = R.getController(); std::pmr::memory_resource& M = R; { - static_assert(std::is_same::value, "Must be void*"); + static_assert(std::is_same::value, "Must be void*"); static_assert(std::is_same::value, "Must be void*"); } { - static_assert(!noexcept(M.allocate(0, 0)), "Must not be noexcept."); + static_assert(!noexcept(M.allocate(0, 1)), "Must not be noexcept."); static_assert(!noexcept(M.allocate(0)), "Must not be noexcept."); } { diff --git a/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/deallocate.pass.cpp b/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/deallocate.pass.cpp --- a/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/deallocate.pass.cpp +++ b/libcxx/test/std/utilities/utility/mem.res/mem.res/mem.res.public/deallocate.pass.cpp @@ -35,12 +35,12 @@ auto& P = R.getController(); std::pmr::memory_resource& M = R; { - ASSERT_SAME_TYPE(decltype(M.deallocate(nullptr, 0, 0)), void); - ASSERT_SAME_TYPE(decltype(M.deallocate(nullptr, 0)), void); + ASSERT_SAME_TYPE(decltype(M.deallocate(std::declval(), 0, 0)), void); + ASSERT_SAME_TYPE(decltype(M.deallocate(std::declval(), 0)), void); } { - static_assert(!noexcept(M.deallocate(nullptr, 0, 0))); - static_assert(!noexcept(M.deallocate(nullptr, 0))); + static_assert(!noexcept(M.deallocate(std::declval(), 0, 0))); + static_assert(!noexcept(M.deallocate(std::declval(), 0))); } { int s = 100;