move_if_noexcept.pass.cpp revision 01a0e90783b3ead5eb0854b71017fd2470e65188
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <utility> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class T> 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// typename conditional 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// < 156cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant// !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value, 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// const T&, 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// T&& 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// >::type 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// move_if_noexcept(T& x); 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <utility> 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass A 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A(const A&); 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A& operator=(const A&); 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A() {} 3073d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A(A&&) {} 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 356cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnantstruct legacy 366cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant{ 376cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant legacy() {} 386cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant legacy(const legacy&); 396cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant}; 406cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int i = 0; 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const int ci = 0; 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 466cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant legacy l; 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant A a; 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const A ca; 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 5073d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(i)), int&&>::value), ""); 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(ci)), const int&&>::value), ""); 536cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(a)), A&&>::value), ""); 546cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A&&>::value), ""); 5573d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(i)), const int>::value), ""); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(ci)), const int>::value), ""); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(a)), const A>::value), ""); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A>::value), ""); 6073d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 616cbf9f9b25b5754a3a8398f0dbe582c5c105e029Howard Hinnant static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), ""); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 6301a0e90783b3ead5eb0854b71017fd2470e65188Marshall Clow#if _LIBCPP_STD_VER > 11 6401a0e90783b3ead5eb0854b71017fd2470e65188Marshall Clow constexpr int i1 = 23; 6501a0e90783b3ead5eb0854b71017fd2470e65188Marshall Clow constexpr int i2 = std::move_if_noexcept(i1); 6601a0e90783b3ead5eb0854b71017fd2470e65188Marshall Clow static_assert(i2 == 23, "" ); 6701a0e90783b3ead5eb0854b71017fd2470e65188Marshall Clow#endif 6801a0e90783b3ead5eb0854b71017fd2470e65188Marshall Clow 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 70