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