Add tests for reference binding assertions in std::tuple.
Libc++ provides static assertions to detect reference binding issues inside tuple. This patch adds tests for those diagnostics. It should be noted that these static assertions technically violate the standard since it allows these illegal bindings to occur. Also see https://llvm.org/bugs/show_bug.cgi?id=20855 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@276078 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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
|
||||
|
||||
// <tuple>
|
||||
|
||||
// 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 <tuple>
|
||||
#include <string>
|
||||
|
||||
int main() {
|
||||
std::allocator<void> alloc;
|
||||
|
||||
// expected-error@tuple:* 4 {{static_assert failed "Attempted to construct a reference element in a tuple with an rvalue"}}
|
||||
|
||||
// bind lvalue to rvalue
|
||||
std::tuple<int const&> t(42); // expected-note {{requested here}}
|
||||
std::tuple<int const&> t1(std::allocator_arg, alloc, 42); // expected-note {{requested here}}
|
||||
// bind rvalue to constructed non-rvalue
|
||||
std::tuple<std::string &&> t2("hello"); // expected-note {{requested here}}
|
||||
std::tuple<std::string &&> t3(std::allocator_arg, alloc, "hello"); // expected-note {{requested here}}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// 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
|
||||
|
||||
// <tuple>
|
||||
|
||||
// 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 <tuple>
|
||||
#include <string>
|
||||
#include <functional>
|
||||
#include <cassert>
|
||||
|
||||
static_assert(std::is_constructible<int&, std::reference_wrapper<int>>::value, "");
|
||||
static_assert(std::is_constructible<int const&, std::reference_wrapper<int>>::value, "");
|
||||
|
||||
|
||||
int main() {
|
||||
std::allocator<void> alloc;
|
||||
int x = 42;
|
||||
{
|
||||
std::tuple<int&> t(std::ref(x));
|
||||
assert(&std::get<0>(t) == &x);
|
||||
std::tuple<int&> 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<int&> t(r);
|
||||
assert(&std::get<0>(t) == &x);
|
||||
std::tuple<int&> t1(cr);
|
||||
assert(&std::get<0>(t1) == &x);
|
||||
std::tuple<int&> t2(std::allocator_arg, alloc, r);
|
||||
assert(&std::get<0>(t2) == &x);
|
||||
std::tuple<int&> t3(std::allocator_arg, alloc, cr);
|
||||
assert(&std::get<0>(t3) == &x);
|
||||
}
|
||||
{
|
||||
std::tuple<int const&> t(std::ref(x));
|
||||
assert(&std::get<0>(t) == &x);
|
||||
std::tuple<int const&> t2(std::cref(x));
|
||||
assert(&std::get<0>(t2) == &x);
|
||||
std::tuple<int const&> t3(std::allocator_arg, alloc, std::ref(x));
|
||||
assert(&std::get<0>(t3) == &x);
|
||||
std::tuple<int const&> 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<int const&> t(r);
|
||||
assert(&std::get<0>(t) == &x);
|
||||
std::tuple<int const&> t2(cr);
|
||||
assert(&std::get<0>(t2) == &x);
|
||||
std::tuple<int const&> t3(std::allocator_arg, alloc, r);
|
||||
assert(&std::get<0>(t3) == &x);
|
||||
std::tuple<int const&> t4(std::allocator_arg, alloc, cr);
|
||||
assert(&std::get<0>(t4) == &x);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user