1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03
10
11// <tuple>
12
13// inline constexpr ignore-type ignore;
14
15#include <cassert>
16#include <cstdint>
17#include <tuple>
18#include <type_traits>
19
20#include "test_macros.h"
21
22static_assert(std::is_trivially_copyable<decltype(std::ignore)>::value, "");
23static_assert(std::is_trivially_default_constructible<decltype(std::ignore)>::value, "");
24
25#if TEST_STD_VER >= 17
26[[nodiscard]] constexpr int test_nodiscard() { return 8294; }
27#endif
28
29TEST_CONSTEXPR_CXX14 bool test() {
30 { [[maybe_unused]] auto& ignore_v = std::ignore; }
31
32 { // Test that std::ignore provides converting assignment.
33 auto& res = (std::ignore = 42);
34 static_assert(noexcept(res = (std::ignore = 42)), "Must be noexcept");
35 assert(&res == &std::ignore);
36 }
37 { // Test bit-field binding.
38 struct S {
39 unsigned int bf : 3;
40 };
41 S s{.bf: 0b010};
42 auto& res = (std::ignore = s.bf);
43 assert(&res == &std::ignore);
44 }
45 { // Test that std::ignore provides copy/move constructors
46 auto copy = std::ignore;
47 [[maybe_unused]] auto moved = std::move(copy);
48 }
49 { // Test that std::ignore provides copy/move assignment
50 auto copy = std::ignore;
51 copy = std::ignore;
52 auto moved = std::ignore;
53 moved = std::move(copy);
54 }
55
56#if TEST_STD_VER >= 17
57 { std::ignore = test_nodiscard(); }
58#endif
59
60 return true;
61}
62
63int main(int, char**) {
64 test();
65#if TEST_STD_VER >= 14
66 static_assert(test(), "");
67#endif
68
69 return 0;
70}
71

source code of libcxx/test/std/utilities/tuple/tuple.general/ignore.pass.cpp