//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // type_traits // add_rvalue_reference // If T names a referenceable type then the member typedef type // shall name T&&; otherwise, type shall name T. #include #include "test_macros.h" template void test_add_rvalue_reference() { ASSERT_SAME_TYPE(U, typename std::add_rvalue_reference::type); #if TEST_STD_VER > 11 ASSERT_SAME_TYPE(U, std::add_rvalue_reference_t); #endif } template void test_function0() { ASSERT_SAME_TYPE(F&&, typename std::add_rvalue_reference::type); #if TEST_STD_VER > 11 ASSERT_SAME_TYPE(F&&, std::add_rvalue_reference_t); #endif } template void test_function1() { ASSERT_SAME_TYPE(F, typename std::add_rvalue_reference::type); #if TEST_STD_VER > 11 ASSERT_SAME_TYPE(F, std::add_rvalue_reference_t); #endif } struct Foo {}; int main(int, char**) { test_add_rvalue_reference(); test_add_rvalue_reference(); test_add_rvalue_reference(); test_add_rvalue_reference(); test_add_rvalue_reference(); test_add_rvalue_reference(); test_add_rvalue_reference(); test_add_rvalue_reference(); // LWG 2101 specifically talks about add_rvalue_reference and functions. // The term of art is "a referenceable type", which a cv- or ref-qualified function is not. test_function0(); test_function1(); test_function1(); test_function1(); test_function1(); test_function1(); // But a cv- or ref-qualified member function *is* "a referenceable type" test_function0(); test_function0(); test_function0(); test_function0(); test_function0(); test_function0(); return 0; }