92 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410// TODO: Change to XFAIL once https://llvm.org/PR40995 is fixed11// UNSUPPORTED: availability-pmr-missing12 13// <memory_resource>14 15// memory_resource *new_delete_resource()16 17#include <memory_resource>18#include <cassert>19#include <type_traits>20 21#include "count_new.h"22#include "test_macros.h"23 24class assert_on_compare : public std::pmr::memory_resource {25 void* do_allocate(std::size_t, size_t) override {26 assert(false);27 return nullptr;28 }29 30 void do_deallocate(void*, std::size_t, size_t) override { assert(false); }31 32 bool do_is_equal(const std::pmr::memory_resource&) const noexcept override {33 assert(false);34 return true;35 }36};37 38void test_return() {39 { ASSERT_SAME_TYPE(decltype(std::pmr::new_delete_resource()), std::pmr::memory_resource*); }40 // assert not null41 { assert(std::pmr::new_delete_resource()); }42 // assert same return value43 { assert(std::pmr::new_delete_resource() == std::pmr::new_delete_resource()); }44}45 46void test_equality() {47 // Same object48 {49 std::pmr::memory_resource& r1 = *std::pmr::new_delete_resource();50 std::pmr::memory_resource& r2 = *std::pmr::new_delete_resource();51 // check both calls returned the same object52 assert(&r1 == &r2);53 // check for proper equality semantics54 assert(r1 == r2);55 assert(r2 == r1);56 assert(!(r1 != r2));57 assert(!(r2 != r1));58 }59 // Different types60 {61 std::pmr::memory_resource& r1 = *std::pmr::new_delete_resource();62 assert_on_compare c;63 std::pmr::memory_resource& r2 = c;64 assert(r1 != r2);65 assert(!(r1 == r2));66 }67}68 69void test_allocate_deallocate() {70 std::pmr::memory_resource& r1 = *std::pmr::new_delete_resource();71 72 globalMemCounter.reset();73 74 void* ret = r1.allocate(50);75 assert(ret);76 ASSERT_WITH_LIBRARY_INTERNAL_ALLOCATIONS(globalMemCounter.checkOutstandingNewEq(1));77 ASSERT_WITH_LIBRARY_INTERNAL_ALLOCATIONS(globalMemCounter.checkLastNewSizeEq(50));78 79 r1.deallocate(ret, 50);80 assert(globalMemCounter.checkOutstandingNewEq(0));81 ASSERT_WITH_LIBRARY_INTERNAL_ALLOCATIONS(globalMemCounter.checkDeleteCalledEq(1));82}83 84int main(int, char**) {85 ASSERT_NOEXCEPT(std::pmr::new_delete_resource());86 test_return();87 test_equality();88 test_allocate_deallocate();89 90 return 0;91}92