1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <utility>
11 
12 // template <class T>
13 //     typename conditional
14 //     <
15 //         !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value,
16 //         const T&,
17 //         T&&
18 //     >::type
19 //     move_if_noexcept(T& x);
20 
21 #include <utility>
22 
23 #include "test_macros.h"
24 
25 class A
26 {
27     A(const A&);
28     A& operator=(const A&);
29 public:
30 
A()31     A() {}
32 #if TEST_STD_VER >= 11
A(A &&)33     A(A&&) {}
34 #endif
35 };
36 
37 struct legacy
38 {
legacylegacy39     legacy() {}
40     legacy(const legacy&);
41 };
42 
main()43 int main()
44 {
45     int i = 0;
46     const int ci = 0;
47 
48     legacy l;
49     A a;
50     const A ca;
51 
52 #if TEST_STD_VER >= 11
53     static_assert((std::is_same<decltype(std::move_if_noexcept(i)), int&&>::value), "");
54     static_assert((std::is_same<decltype(std::move_if_noexcept(ci)), const int&&>::value), "");
55     static_assert((std::is_same<decltype(std::move_if_noexcept(a)), A&&>::value), "");
56     static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A&&>::value), "");
57     static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), "");
58 #else  // C++ < 11
59     // In C++03 libc++ #define's decltype to be __decltype on clang and
60     // __typeof__ for other compilers. __typeof__ does not deduce the reference
61     // qualifiers and will cause this test to fail.
62     static_assert((std::is_same<decltype(std::move_if_noexcept(i)), const int&>::value), "");
63     static_assert((std::is_same<decltype(std::move_if_noexcept(ci)), const int&>::value), "");
64     static_assert((std::is_same<decltype(std::move_if_noexcept(a)), const A&>::value), "");
65     static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A&>::value), "");
66     static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), "");
67 #endif
68 
69 #if TEST_STD_VER > 11
70     constexpr int i1 = 23;
71     constexpr int i2 = std::move_if_noexcept(i1);
72     static_assert(i2 == 23, "" );
73 #endif
74 
75 }
76