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 // Test that entities declared [[nodiscard]] as at extension by libc++, are
10 // not declared as such when _LIBCPP_DISABLE_NODISCARD_EXT is specified.
11
12 // All entities to which libc++ applies [[nodiscard]] as an extension should
13 // be tested here and in nodiscard_extensions.verify.cpp. They should also
14 // be listed in `UsingLibcxx.rst` in the documentation for the extension.
15
16 // Disable any builtin recognition of std::* in the compiler, that might also
17 // trigger -Wunused-value warnings.
18 // ADDITIONAL_COMPILE_FLAGS: -fno-builtin
19
20 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_DISABLE_NODISCARD_EXT
21
22 #include <algorithm>
23 #include <bit> // bit_cast
24 #include <cstddef> // to_integer
25 #include <functional> // identity
26 #include <iterator>
27 #include <memory>
28 #include <utility> // to_underlying
29
30 #include "test_macros.h"
31
32 struct P {
operator ()P33 bool operator()(int) const { return false; }
34 };
35
test_algorithms()36 void test_algorithms() {
37 int arr[1] = { 1 };
38
39 std::adjacent_find(std::begin(arr), std::end(arr));
40 std::adjacent_find(std::begin(arr), std::end(arr), std::greater<int>());
41 std::all_of(std::begin(arr), std::end(arr), P());
42 std::any_of(std::begin(arr), std::end(arr), P());
43 std::binary_search(std::begin(arr), std::end(arr), 1);
44 std::binary_search(std::begin(arr), std::end(arr), 1, std::greater<int>());
45 #if TEST_STD_VER >= 17
46 std::clamp(2, 1, 3);
47 std::clamp(2, 3, 1, std::greater<int>());
48 #endif
49 std::count_if(std::begin(arr), std::end(arr), P());
50 std::count(std::begin(arr), std::end(arr), 1);
51 std::equal_range(std::begin(arr), std::end(arr), 1);
52 std::equal_range(std::begin(arr), std::end(arr), 1, std::greater<int>());
53 std::equal(std::begin(arr), std::end(arr), std::begin(arr));
54 std::equal(std::begin(arr), std::end(arr), std::begin(arr),
55 std::greater<int>());
56 #if TEST_STD_VER >= 14
57 std::equal(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr));
58 std::equal(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr),
59 std::greater<int>());
60 #endif
61 std::find_end(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr));
62 std::find_end(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr),
63 std::greater<int>());
64 std::find_first_of(std::begin(arr), std::end(arr), std::begin(arr),
65 std::end(arr));
66 std::find_first_of(std::begin(arr), std::end(arr), std::begin(arr),
67 std::end(arr), std::greater<int>());
68 std::find_if_not(std::begin(arr), std::end(arr), P());
69 std::find_if(std::begin(arr), std::end(arr), P());
70 std::find(std::begin(arr), std::end(arr), 1);
71 std::get_temporary_buffer<int>(1);
72 std::includes(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr));
73 std::includes(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr),
74 std::greater<int>());
75 std::is_heap_until(std::begin(arr), std::end(arr));
76 std::is_heap_until(std::begin(arr), std::end(arr), std::greater<int>());
77 std::is_heap(std::begin(arr), std::end(arr));
78 std::is_heap(std::begin(arr), std::end(arr), std::greater<int>());
79 std::is_partitioned(std::begin(arr), std::end(arr), P());
80 std::is_permutation(std::begin(arr), std::end(arr), std::begin(arr));
81 std::is_permutation(std::begin(arr), std::end(arr), std::begin(arr),
82 std::greater<int>());
83 #if TEST_STD_VER >= 14
84 std::is_permutation(std::begin(arr), std::end(arr), std::begin(arr),
85 std::end(arr));
86 std::is_permutation(std::begin(arr), std::end(arr), std::begin(arr),
87 std::end(arr), std::greater<int>());
88 #endif
89 std::is_sorted_until(std::begin(arr), std::end(arr));
90 std::is_sorted_until(std::begin(arr), std::end(arr), std::greater<int>());
91 std::is_sorted(std::begin(arr), std::end(arr));
92 std::is_sorted(std::begin(arr), std::end(arr), std::greater<int>());
93 std::lexicographical_compare(std::begin(arr), std::end(arr), std::begin(arr),
94 std::end(arr));
95 std::lexicographical_compare(std::begin(arr), std::end(arr), std::begin(arr),
96 std::end(arr), std::greater<int>());
97 std::lower_bound(std::begin(arr), std::end(arr), 1);
98 std::lower_bound(std::begin(arr), std::end(arr), 1, std::greater<int>());
99 std::max_element(std::begin(arr), std::end(arr));
100 std::max_element(std::begin(arr), std::end(arr), std::greater<int>());
101 std::max(1, 2);
102 std::max(1, 2, std::greater<int>());
103 #if TEST_STD_VER >= 11
104 std::max({1, 2, 3});
105 std::max({1, 2, 3}, std::greater<int>());
106 #endif
107 std::min_element(std::begin(arr), std::end(arr));
108 std::min_element(std::begin(arr), std::end(arr), std::greater<int>());
109 std::min(1, 2);
110 std::min(1, 2, std::greater<int>());
111 #if TEST_STD_VER >= 11
112 std::min({1, 2, 3});
113 std::min({1, 2, 3}, std::greater<int>());
114 #endif
115 std::minmax_element(std::begin(arr), std::end(arr));
116 std::minmax_element(std::begin(arr), std::end(arr), std::greater<int>());
117 std::minmax(1, 2);
118 std::minmax(1, 2, std::greater<int>());
119 #if TEST_STD_VER >= 11
120 std::minmax({1, 2, 3});
121 std::minmax({1, 2, 3}, std::greater<int>());
122 #endif
123 std::mismatch(std::begin(arr), std::end(arr), std::begin(arr));
124 std::mismatch(std::begin(arr), std::end(arr), std::begin(arr),
125 std::greater<int>());
126 #if TEST_STD_VER >= 14
127 std::mismatch(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr));
128 std::mismatch(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr),
129 std::greater<int>());
130 #endif
131 std::none_of(std::begin(arr), std::end(arr), P());
132 std::remove_if(std::begin(arr), std::end(arr), P());
133 std::remove(std::begin(arr), std::end(arr), 1);
134 std::search_n(std::begin(arr), std::end(arr), 1, 1);
135 std::search_n(std::begin(arr), std::end(arr), 1, 1, std::greater<int>());
136 std::search(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr));
137 std::search(std::begin(arr), std::end(arr), std::begin(arr), std::end(arr),
138 std::greater<int>());
139 #if TEST_STD_VER >= 17
140 std::search(std::begin(arr), std::end(arr),
141 std::default_searcher(std::begin(arr), std::end(arr)));
142 #endif
143 std::unique(std::begin(arr), std::end(arr));
144 std::unique(std::begin(arr), std::end(arr), std::greater<int>());
145 std::upper_bound(std::begin(arr), std::end(arr), 1);
146 std::upper_bound(std::begin(arr), std::end(arr), 1, std::greater<int>());
147 }
148
149 template<class LV, class RV>
test_template_cast_wrappers(LV && lv,RV && rv)150 void test_template_cast_wrappers(LV&& lv, RV&& rv) {
151 std::forward<LV>(lv);
152 std::forward<RV>(rv);
153 std::move(lv);
154 std::move(rv);
155 std::move_if_noexcept(lv);
156 std::move_if_noexcept(rv);
157
158 #if TEST_STD_VER >= 17
159 std::as_const(lv);
160 std::as_const(rv);
161 #endif
162
163 #if TEST_STD_VER >= 20
164 std::identity()(lv);
165 std::identity()(rv);
166 #endif
167 }
168
test_nontemplate_cast_wrappers()169 void test_nontemplate_cast_wrappers()
170 {
171 #if TEST_STD_VER > 14
172 std::byte b{42};
173 std::to_integer<int>(b);
174 #endif
175
176 #if TEST_STD_VER > 20
177 enum E { Apple, Orange } e = Apple;
178 std::to_underlying(e);
179 #endif
180 }
181
tests()182 void tests() {
183 test_algorithms();
184
185 int i = 42;
186 test_template_cast_wrappers(i, std::move(i));
187 test_nontemplate_cast_wrappers();
188 }
189