//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // type_traits // add_lvalue_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_lvalue_reference() { static_assert((std::is_same::type, U>::value), ""); #if TEST_STD_VER > 11 static_assert((std::is_same, U>::value), ""); #endif } template void test_function0() { static_assert((std::is_same::type, F&>::value), ""); #if TEST_STD_VER > 11 static_assert((std::is_same, F&>::value), ""); #endif } template void test_function1() { static_assert((std::is_same::type, F>::value), ""); #if TEST_STD_VER > 11 static_assert((std::is_same, F>::value), ""); #endif } struct Foo {}; int main() { test_add_lvalue_reference(); test_add_lvalue_reference(); test_add_lvalue_reference(); test_add_lvalue_reference(); test_add_lvalue_reference(); test_add_lvalue_reference(); test_add_lvalue_reference(); test_add_lvalue_reference(); // LWG 2101 specifically talks about add_lvalue_reference and functions. // The term of art is "a referenceable type", which a cv- or ref-qualified function is not. test_function0(); #if TEST_STD_VER >= 11 test_function1(); test_function1(); test_function1(); test_function1(); test_function1(); #endif // But a cv- or ref-qualified member function *is* "a referenceable type" test_function0(); #if TEST_STD_VER >= 11 test_function0(); test_function0(); test_function0(); test_function0(); test_function0(); #endif }