]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/20_util/shared_ptr/cons/58659.cc
Update copyright years in libstdc++-v3/
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / shared_ptr / cons / 58659.cc
1 // { dg-options "-std=gnu++11" }
2
3 // Copyright (C) 2013-2014 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>
38 allocator(const allocator<U>&) { }
39
40 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
48 void deallocate(value_type* p, size_t n)
49 {
50 VERIFY(n == 1 && p == (void*)storage && allocated);
51 allocated = false;
52 }
53
54 static char storage[sizeof(spcd)];
55 static bool allocated;
56 };
57
58 char allocator<spcd>::storage[];
59 bool allocator<spcd>::allocated = false;
60 }
61
62 int main()
63 {
64 std::shared_ptr<X> s( std::unique_ptr<X>(new X) );
65 VERIFY( std::allocator<spcd>::allocated );
66 s.reset();
67 VERIFY( !std::allocator<spcd>::allocated );
68 }