diff --git a/libcxx/include/__availability b/libcxx/include/__availability --- a/libcxx/include/__availability +++ b/libcxx/include/__availability @@ -172,6 +172,8 @@ // be avoided. // # define _LIBCPP_HAS_NO_VERBOSE_ABORT_IN_LIBRARY +# define _LIBCPP_AVAILABILITY_MEMORY_RESOURCE + #elif defined(__APPLE__) # define _LIBCPP_AVAILABILITY_SHARED_MUTEX \ @@ -273,6 +275,8 @@ # define _LIBCPP_HAS_NO_VERBOSE_ABORT_IN_LIBRARY +# define _LIBCPP_AVAILABILITY_MEMORY_RESOURCE __attribute__((__unavailable__)) + #else // ...New vendors can add availability markup here... 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 @@ -61,13 +61,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; +_LIBCPP_AVAILABILITY_MEMORY_RESOURCE _LIBCPP_FUNC_VIS memory_resource* get_default_resource() noexcept; +_LIBCPP_AVAILABILITY_MEMORY_RESOURCE _LIBCPP_FUNC_VIS memory_resource* set_default_resource(memory_resource*) noexcept; +_LIBCPP_AVAILABILITY_MEMORY_RESOURCE _LIBCPP_FUNC_VIS memory_resource* new_delete_resource() noexcept; +_LIBCPP_AVAILABILITY_MEMORY_RESOURCE _LIBCPP_FUNC_VIS memory_resource* null_memory_resource() noexcept; } // namespace pmr diff --git a/libcxx/include/__memory_resource/monotonic_buffer_resource.h b/libcxx/include/__memory_resource/monotonic_buffer_resource.h --- a/libcxx/include/__memory_resource/monotonic_buffer_resource.h +++ b/libcxx/include/__memory_resource/monotonic_buffer_resource.h @@ -96,7 +96,7 @@ _LIBCPP_HIDE_FROM_ABI memory_resource* upstream_resource() const { return __res_; } protected: - void* do_allocate(size_t __bytes, size_t __alignment) override; // key function + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE void* do_allocate(size_t __bytes, size_t __alignment) override; // key function _LIBCPP_HIDE_FROM_ABI void do_deallocate(void*, size_t, size_t) override {} diff --git a/libcxx/include/__memory_resource/synchronized_pool_resource.h b/libcxx/include/__memory_resource/synchronized_pool_resource.h --- a/libcxx/include/__memory_resource/synchronized_pool_resource.h +++ b/libcxx/include/__memory_resource/synchronized_pool_resource.h @@ -76,7 +76,8 @@ return __unsync_.deallocate(__p, __bytes, __align); } - bool do_is_equal(const memory_resource& __other) const noexcept override; // key function + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE bool + do_is_equal(const memory_resource& __other) const noexcept override; // key function private: # if !defined(_LIBCPP_HAS_NO_THREADS) 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 @@ -57,6 +57,7 @@ int __pool_index(size_t __bytes, size_t __align) const; public: + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE unsynchronized_pool_resource(const pool_options& __opts, memory_resource* __upstream); _LIBCPP_HIDE_FROM_ABI unsynchronized_pool_resource() @@ -74,16 +75,16 @@ unsynchronized_pool_resource& operator=(const unsynchronized_pool_resource&) = delete; - void release(); + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE void release(); _LIBCPP_HIDE_FROM_ABI memory_resource* upstream_resource() const { return __res_; } - pool_options options() const; + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE pool_options options() const; protected: - void* do_allocate(size_t __bytes, size_t __align) override; // key function + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE void* do_allocate(size_t __bytes, size_t __align) override; // key function - void do_deallocate(void* __p, size_t __bytes, size_t __align) override; + _LIBCPP_AVAILABILITY_MEMORY_RESOURCE void do_deallocate(void* __p, size_t __bytes, size_t __align) override; _LIBCPP_HIDE_FROM_ABI bool do_is_equal(const memory_resource& __other) const _NOEXCEPT override { return &__other == this; diff --git a/libcxx/test/libcxx/mem/mem.res/availability.verify.cpp b/libcxx/test/libcxx/mem/mem.res/availability.verify.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/mem/mem.res/availability.verify.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14 +// REQUIRES: (use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14|15}}) || (use_system_cxx_lib && target={{.+}}-apple-macosx{{11.0|12.0}}) + +#include + +struct SyncMemRes : std::pmr::synchronized_pool_resource { + bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override { + return std::pmr::synchronized_pool_resource::do_is_equal(other); // expected-error {{is unavailable}} + } +}; + +struct MonotonicMemRes : std::pmr::monotonic_buffer_resource { + void* do_allocate(size_t bytes, size_t alignment) override { + return std::pmr::monotonic_buffer_resource::do_allocate(bytes, alignment); // expected-error {{is unavailable}} + } +}; + +struct UnsyncMemRes : std::pmr::unsynchronized_pool_resource { + void* do_allocate(size_t bytes, size_t alignment) override { + return std::pmr::unsynchronized_pool_resource::do_allocate(bytes, alignment); // expected-error {{is unavailable}} + } + + void do_deallocate(void* ptr, size_t bytes, size_t alignment) override { + return std::pmr::unsynchronized_pool_resource::do_deallocate(ptr, bytes, alignment); + } +}; + +void functions() { + std::pmr::get_default_resource(); // expected-error {{is unavailable}} + std::pmr::set_default_resource(nullptr); // expected-error {{is unavailable}} + std::pmr::new_delete_resource(); // expected-error {{is unavailable}} + std::pmr::null_memory_resource(); // expected-error {{is unavailable}} +} + +void unsynchronized_pool_resource() { + std::pmr::unsynchronized_pool_resource res(std::pmr::pool_options{}, nullptr); // expected-error {{is unavailable}} + res.release(); // expected-error {{is unavailable}} + res.options(); // expected-error {{is unavailable}} +}