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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef TEST_STD_UTILITIES_MEMORY_UTIL_SMARTPTR_SHARED_CONST_TYPES_H
10 #define TEST_STD_UTILITIES_MEMORY_UTIL_SMARTPTR_SHARED_CONST_TYPES_H
11 
12 #include <type_traits>
13 
14 struct bad_type {};
15 
16 struct bad_deleter {
operatorbad_deleter17   void operator()(bad_type) {}
18 };
19 
20 struct no_move_deleter {
21   no_move_deleter(no_move_deleter const&) = delete;
22   no_move_deleter(no_move_deleter&&)      = delete;
operatorno_move_deleter23   void operator()(int*) {}
24 };
25 
26 static_assert(!std::is_move_constructible<no_move_deleter>::value, "");
27 
28 struct no_nullptr_deleter {
operatorno_nullptr_deleter29   void operator()(int*) const {}
30   void operator()(std::nullptr_t) const = delete;
31 };
32 
33 struct base {};
34 struct derived : base {};
35 
36 template <class T>
37 class move_deleter {
38   move_deleter();
39   move_deleter(move_deleter const&);
40 
41 public:
move_deleter(move_deleter &&)42   move_deleter(move_deleter&&) {}
43 
move_deleter(int)44   explicit move_deleter(int) {}
45 
operator()46   void operator()(T* ptr) { delete ptr; }
47 };
48 
49 #endif // TEST_STD_UTILITIES_MEMORY_UTIL_SMARTPTR_SHARED_CONST_TYPES_H
50