1 // Copyright (C) 2019-2020 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library.  This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3.  If not see
16 // <http://www.gnu.org/licenses/>.
17 
18 // { dg-do compile { target c++11 } }
19 
20 #include <memory>
21 
22 struct Del {
23   Del() = default;
24   Del(Del&&) = delete;
25 
26   void operator()(int*) const;
27 };
28 
29 static_assert(!std::is_move_constructible<std::unique_ptr<int, Del>>::value);
30 static_assert(std::is_move_constructible<std::unique_ptr<int, Del&>>::value);
31 
32 struct Del2 {
33   Del2() = default;
34   Del2(Del2&&) = default;
35   Del2& operator=(Del2&&) = delete;
36   Del2& operator=(const Del2&) = default;
37 
38   void operator()(int*) const;
39 };
40 
41 static_assert(!std::is_move_assignable<std::unique_ptr<int, Del2>>::value);
42 static_assert(std::is_move_assignable<std::unique_ptr<int, Del2&>>::value);
43 
44 struct Del3 {
45   Del3() = default;
46   Del3(Del3&&) = default;
47   Del3& operator=(Del3&&) = default;
48   Del3& operator=(const Del3&) = delete;
49 
50   void operator()(int*) const;
51 };
52 
53 static_assert(std::is_move_assignable<std::unique_ptr<int, Del3>>::value);
54 static_assert(!std::is_move_assignable<std::unique_ptr<int, Del3&>>::value);
55