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()70 int 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