• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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