diff options
author | Eric Fiselier <eric@efcs.ca> | 2017-02-06 01:25:31 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2017-02-06 01:25:31 +0000 |
commit | 9af60c4a8b0132ec395c61c93f7d3e2af622a433 (patch) | |
tree | 5585ac50b1ce175c45c2eddbead35c26f2ebd8bd /libcxx/test/std/utilities/tuple | |
parent | 75218fb6b1c979ce4891303c0cf2560639d68033 (diff) | |
download | bcm5719-llvm-9af60c4a8b0132ec395c61c93f7d3e2af622a433.tar.gz bcm5719-llvm-9af60c4a8b0132ec395c61c93f7d3e2af622a433.zip |
Implement LWG 2773 - std::ignore should be constexpr.
In addition to the PR for LWG 2773 this patch also ensures
that each of std::ignores constructors or assignment operators
are constexpr.
llvm-svn: 294165
Diffstat (limited to 'libcxx/test/std/utilities/tuple')
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.general/ignore.pass.cpp | 56 | ||||
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tie.pass.cpp | 21 |
2 files changed, 77 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/tuple/tuple.general/ignore.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.general/ignore.pass.cpp new file mode 100644 index 00000000000..8dae3a5dcb0 --- /dev/null +++ b/libcxx/test/std/utilities/tuple/tuple.general/ignore.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// <tuple> + +// constexpr unspecified ignore; + +// UNSUPPORTED: c++98, c++03 + +#include <tuple> +#include <cassert> + +#include "test_macros.h" + +constexpr bool test_ignore_constexpr() +{ +#if TEST_STD_VER > 11 + { // Test that std::ignore provides constexpr converting assignment. + auto& res = (std::ignore = 42); + assert(&res == &std::ignore); + } + { // Test that std::ignore provides constexpr copy/move constructors + auto copy = std::ignore; + auto moved = std::move(copy); + ((void)moved); + } + { // Test that std::ignore provides constexpr copy/move assignment + auto copy = std::ignore; + copy = std::ignore; + auto moved = std::ignore; + moved = std::move(copy); + } +#endif + return true; +} + +int main() { + { + constexpr auto& ignore_v = std::ignore; + ((void)ignore_v); + } + { + static_assert(test_ignore_constexpr(), ""); + } +#if defined(_LIBCPP_VERSION) + { + static_assert(std::is_trivial<decltype(std::ignore)>::value, ""); + } +#endif +} diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tie.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tie.pass.cpp index c4c3c242d8f..5dc98afe661 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tie.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.creation/tie.pass.cpp @@ -22,6 +22,24 @@ #include "test_macros.h" +#if TEST_STD_VER > 11 +constexpr bool test_tie_constexpr() { + { + int i = 42; + double f = 1.1; + using ExpectT = std::tuple<int&, decltype(std::ignore)&, double&>; + auto res = std::tie(i, std::ignore, f); + static_assert(std::is_same<ExpectT, decltype(res)>::value, ""); + assert(&std::get<0>(res) == &i); + assert(&std::get<1>(res) == &std::ignore); + assert(&std::get<2>(res) == &f); + // FIXME: If/when tuple gets constexpr assignment + //res = std::make_tuple(101, nullptr, -1.0); + } + return true; +} +#endif + int main() { { @@ -39,5 +57,8 @@ int main() static_assert ( std::get<0>(t) == 42, "" ); static_assert ( std::get<1>(t) == 1.1, "" ); } + { + static_assert(test_tie_constexpr(), ""); + } #endif } |