1 // { dg-do run { target c++11 } } 2 3 // Copyright (C) 2013-2019 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // You should have received a copy of the GNU General Public License along 17 // with this library; see the file COPYING3. If not see 18 // <http://www.gnu.org/licenses/>. 19 20 #include <memory> 21 #include <testsuite_hooks.h> 22 23 struct X { }; 24 25 using spcd = std::_Sp_counted_deleter<X*, std::default_delete<X>, 26 std::allocator<void>, std::__default_lock_policy>; 27 28 namespace std 29 { 30 template<> 31 struct allocator<spcd> 32 { 33 using value_type = spcd; 34 35 allocator() = default; 36 37 template<typename U> allocatorstd::allocator38 allocator(const allocator<U>&) { } 39 allocatestd::allocator40 value_type* allocate(size_t n) 41 { 42 if (n != 1) 43 throw bad_alloc(); 44 allocated = true; 45 return static_cast<value_type*>((void*)(storage)); 46 } 47 deallocatestd::allocator48 void deallocate(value_type* p, size_t n) 49 { 50 VERIFY(n == 1 && p == (void*)storage && allocated); 51 allocated = false; 52 } 53 54 template<typename _Up, typename... _Args> constructstd::allocator55 void construct(_Up* __p, _Args&&... __args) 56 { ::new(__p) _Up(std::forward<_Args>(__args)...); } 57 58 template<typename _Up> destroystd::allocator59 void destroy(_Up* __p) 60 { __p->~_Up(); } 61 62 static char storage[sizeof(spcd)]; 63 static bool allocated; 64 }; 65 66 char allocator<spcd>::storage[]; 67 bool allocator<spcd>::allocated = false; 68 } 69 main()70int main() 71 { 72 std::shared_ptr<X> s( std::unique_ptr<X>(new X) ); 73 VERIFY( std::allocator<spcd>::allocated ); 74 s.reset(); 75 VERIFY( !std::allocator<spcd>::allocated ); 76 } 77