//===----------------------------------------------------------------------===// // // 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. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03 // // Test the diagnostics libc++ generates for invalid reference binding. // Libc++ attempts to diagnose the following cases: // * Constructing an lvalue reference from an rvalue. // * Constructing an rvalue reference from an lvalue. #include #include #include #include static_assert(std::is_constructible>::value, ""); static_assert(std::is_constructible>::value, ""); int main() { std::allocator alloc; int x = 42; { std::tuple t(std::ref(x)); assert(&std::get<0>(t) == &x); std::tuple t1(std::allocator_arg, alloc, std::ref(x)); assert(&std::get<0>(t1) == &x); } { auto r = std::ref(x); auto const& cr = r; std::tuple t(r); assert(&std::get<0>(t) == &x); std::tuple t1(cr); assert(&std::get<0>(t1) == &x); std::tuple t2(std::allocator_arg, alloc, r); assert(&std::get<0>(t2) == &x); std::tuple t3(std::allocator_arg, alloc, cr); assert(&std::get<0>(t3) == &x); } { std::tuple t(std::ref(x)); assert(&std::get<0>(t) == &x); std::tuple t2(std::cref(x)); assert(&std::get<0>(t2) == &x); std::tuple t3(std::allocator_arg, alloc, std::ref(x)); assert(&std::get<0>(t3) == &x); std::tuple t4(std::allocator_arg, alloc, std::cref(x)); assert(&std::get<0>(t4) == &x); } { auto r = std::ref(x); auto cr = std::cref(x); std::tuple t(r); assert(&std::get<0>(t) == &x); std::tuple t2(cr); assert(&std::get<0>(t2) == &x); std::tuple t3(std::allocator_arg, alloc, r); assert(&std::get<0>(t3) == &x); std::tuple t4(std::allocator_arg, alloc, cr); assert(&std::get<0>(t4) == &x); } }