Skip to content

Commit cc2cf8b

Browse files
committed
[libc++] Add test for checking progress on P0533R9
This test checks progress on P0533R9 (https://wg21.link/p0533r9). Whenever a desired function becomes constexpr, the programmer won't forget to switch `ASSERT_NOT_CONSTEXPR_CXX23` to `ASSERT_CONSTEXPR_CXX23` and eventually to change the paper's implementation status. The test also works as a reference list of unimplemented functions. Reviewed By: philnik, #libc Differential Revision: https://reviews.llvm.org/D136538
1 parent 70fdabf commit cc2cf8b

File tree

2 files changed

+512
-0
lines changed

2 files changed

+512
-0
lines changed
Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
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+
// Check that Clang supports constexpr <cmath> and <cstdlib> functions
10+
// mentioned in the P0533R9 paper that is part of C++2b
11+
// (https://wg21.link/p0533r9)
12+
//
13+
// Every function called in this test should become constexpr. Whenever some
14+
// of the desired function become constexpr, the programmer switches
15+
// `ASSERT_NOT_CONSTEXPR_CXX23` to `ASSERT_CONSTEXPR_CXX23` and eventually the
16+
// paper is implemented in Clang.
17+
// The test also works as a reference list of unimplemented functions.
18+
//
19+
// REQUIRES: clang
20+
// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
21+
22+
#include <cmath>
23+
#include <cstdlib>
24+
#include <cassert>
25+
26+
int main(int, char**) {
27+
bool ImplementedP0533R9 = true;
28+
29+
#define ASSERT_CONSTEXPR_CXX23(Expr) static_assert(__builtin_constant_p(Expr) && (Expr))
30+
#define ASSERT_NOT_CONSTEXPR_CXX23(Expr) \
31+
static_assert(!__builtin_constant_p(Expr)); \
32+
assert(Expr); \
33+
ImplementedP0533R9 = false
34+
35+
int DummyInt;
36+
float DummyFloat;
37+
double DummyDouble;
38+
long double DummyLongDouble;
39+
40+
ASSERT_NOT_CONSTEXPR_CXX23(std::abs(-1) == 1);
41+
ASSERT_NOT_CONSTEXPR_CXX23(std::abs(-1L) == 1L);
42+
ASSERT_NOT_CONSTEXPR_CXX23(std::abs(-1LL) == 1LL);
43+
ASSERT_NOT_CONSTEXPR_CXX23(std::abs(-1.0f) == 1.0f);
44+
ASSERT_NOT_CONSTEXPR_CXX23(std::abs(-1.0) == 1.0);
45+
ASSERT_NOT_CONSTEXPR_CXX23(std::abs(-1.0L) == 1.0L);
46+
47+
ASSERT_NOT_CONSTEXPR_CXX23(std::labs(-1L) == 1L);
48+
ASSERT_NOT_CONSTEXPR_CXX23(std::llabs(-1LL) == 1LL);
49+
50+
ASSERT_NOT_CONSTEXPR_CXX23(std::div(13, 5).rem == 3);
51+
ASSERT_NOT_CONSTEXPR_CXX23(std::div(13L, 5L).rem == 3L);
52+
ASSERT_NOT_CONSTEXPR_CXX23(std::div(13LL, 5LL).rem == 3LL);
53+
ASSERT_NOT_CONSTEXPR_CXX23(std::ldiv(13L, 5L).rem == 3L);
54+
ASSERT_NOT_CONSTEXPR_CXX23(std::lldiv(13LL, 5LL).rem == 3LL);
55+
56+
ASSERT_NOT_CONSTEXPR_CXX23(std::frexp(0.0f, &DummyInt) == 0.0f);
57+
ASSERT_NOT_CONSTEXPR_CXX23(std::frexp(0.0, &DummyInt) == 0.0);
58+
ASSERT_NOT_CONSTEXPR_CXX23(std::frexp(0.0L, &DummyInt) == 0.0L);
59+
ASSERT_NOT_CONSTEXPR_CXX23(std::frexpf(0.0f, &DummyInt) == 0.0f);
60+
ASSERT_NOT_CONSTEXPR_CXX23(std::frexpl(0.0L, &DummyInt) == 0.0L);
61+
62+
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogb(1.0f) == 0);
63+
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogb(1.0) == 0);
64+
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogb(1.0L) == 0);
65+
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogbf(1.0f) == 0);
66+
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogbl(1.0L) == 0);
67+
68+
ASSERT_NOT_CONSTEXPR_CXX23(std::ldexp(1.0f, 1) == 2.0f);
69+
ASSERT_NOT_CONSTEXPR_CXX23(std::ldexp(1.0, 1) == 2.0);
70+
ASSERT_NOT_CONSTEXPR_CXX23(std::ldexp(1.0L, 1) == 2.0L);
71+
ASSERT_NOT_CONSTEXPR_CXX23(std::ldexpf(1.0f, 1) == 2.0f);
72+
ASSERT_NOT_CONSTEXPR_CXX23(std::ldexpl(1.0L, 1) == 2.0L);
73+
74+
ASSERT_NOT_CONSTEXPR_CXX23(std::logb(1.0f) == 0.0f);
75+
ASSERT_NOT_CONSTEXPR_CXX23(std::logb(1.0) == 0.0);
76+
ASSERT_NOT_CONSTEXPR_CXX23(std::logb(1.0L) == 0.0L);
77+
ASSERT_NOT_CONSTEXPR_CXX23(std::logbf(1.0f) == 0.0f);
78+
ASSERT_NOT_CONSTEXPR_CXX23(std::logbl(1.0L) == 0.0L);
79+
80+
ASSERT_NOT_CONSTEXPR_CXX23(std::modf(1.0f, &DummyFloat) == 0.0f);
81+
ASSERT_NOT_CONSTEXPR_CXX23(std::modf(1.0, &DummyDouble) == 0.0);
82+
ASSERT_NOT_CONSTEXPR_CXX23(std::modf(1.0L, &DummyLongDouble) == 0.0L);
83+
ASSERT_NOT_CONSTEXPR_CXX23(std::modff(1.0f, &DummyFloat) == 0.0f);
84+
ASSERT_NOT_CONSTEXPR_CXX23(std::modfl(1.0L, &DummyLongDouble) == 0.0L);
85+
86+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbn(1.0f, 1) == 2.0f);
87+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbn(1.0, 1) == 2.0);
88+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbn(1.0L, 1) == 2.0L);
89+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbnf(1.0f, 1) == 2.0f);
90+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbnl(1.0L, 1) == 2.0L);
91+
92+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbln(1.0f, 1L) == 2);
93+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbln(1.0, 1L) == 2.0);
94+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalbln(1.0L, 1L) == 2.0L);
95+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalblnf(1.0f, 1L) == 2.0f);
96+
ASSERT_NOT_CONSTEXPR_CXX23(std::scalblnl(1.0L, 1L) == 2.0L);
97+
98+
ASSERT_NOT_CONSTEXPR_CXX23(std::fabs(-1.0f) == 1.0f);
99+
ASSERT_NOT_CONSTEXPR_CXX23(std::fabs(-1.0) == 1.0);
100+
ASSERT_NOT_CONSTEXPR_CXX23(std::fabs(-1.0L) == 1.0L);
101+
ASSERT_NOT_CONSTEXPR_CXX23(std::fabsf(-1.0f) == 1.0f);
102+
ASSERT_NOT_CONSTEXPR_CXX23(std::fabsl(-1.0L) == 1.0L);
103+
104+
ASSERT_NOT_CONSTEXPR_CXX23(std::ceil(0.0f) == 0.0f);
105+
ASSERT_NOT_CONSTEXPR_CXX23(std::ceil(0.0) == 0.0);
106+
ASSERT_NOT_CONSTEXPR_CXX23(std::ceil(0.0L) == 0.0L);
107+
ASSERT_NOT_CONSTEXPR_CXX23(std::ceilf(0.0f) == 0.0f);
108+
ASSERT_NOT_CONSTEXPR_CXX23(std::ceill(0.0L) == 0.0L);
109+
110+
ASSERT_NOT_CONSTEXPR_CXX23(std::floor(1.0f) == 1.0f);
111+
ASSERT_NOT_CONSTEXPR_CXX23(std::floor(1.0) == 1.0);
112+
ASSERT_NOT_CONSTEXPR_CXX23(std::floor(1.0L) == 1.0L);
113+
ASSERT_NOT_CONSTEXPR_CXX23(std::floorf(1.0f) == 1.0f);
114+
ASSERT_NOT_CONSTEXPR_CXX23(std::floorl(1.0L) == 1.0L);
115+
116+
ASSERT_NOT_CONSTEXPR_CXX23(std::round(1.0f) == 1.0f);
117+
ASSERT_NOT_CONSTEXPR_CXX23(std::round(1.0) == 1.0);
118+
ASSERT_NOT_CONSTEXPR_CXX23(std::round(1.0L) == 1.0L);
119+
ASSERT_NOT_CONSTEXPR_CXX23(std::roundf(1.0f) == 1.0f);
120+
ASSERT_NOT_CONSTEXPR_CXX23(std::roundl(1.0L) == 1.0L);
121+
122+
ASSERT_NOT_CONSTEXPR_CXX23(std::lround(1.0f) == 1L);
123+
ASSERT_NOT_CONSTEXPR_CXX23(std::lround(1.0) == 1L);
124+
ASSERT_NOT_CONSTEXPR_CXX23(std::lround(1.0L) == 1L);
125+
ASSERT_NOT_CONSTEXPR_CXX23(std::lroundf(1.0f) == 1L);
126+
ASSERT_NOT_CONSTEXPR_CXX23(std::lroundl(1.0L) == 1L);
127+
128+
ASSERT_NOT_CONSTEXPR_CXX23(std::llround(1.0f) == 1LL);
129+
ASSERT_NOT_CONSTEXPR_CXX23(std::llround(1.0) == 1LL);
130+
ASSERT_NOT_CONSTEXPR_CXX23(std::llround(1.0L) == 1LL);
131+
ASSERT_NOT_CONSTEXPR_CXX23(std::llroundf(1.0f) == 1LL);
132+
ASSERT_NOT_CONSTEXPR_CXX23(std::llroundl(1.0L) == 1LL);
133+
134+
ASSERT_NOT_CONSTEXPR_CXX23(std::trunc(1.0f) == 1.0f);
135+
ASSERT_NOT_CONSTEXPR_CXX23(std::trunc(1.0) == 1.0);
136+
ASSERT_NOT_CONSTEXPR_CXX23(std::trunc(1.0L) == 1.0L);
137+
ASSERT_NOT_CONSTEXPR_CXX23(std::truncf(1.0f) == 1.0f);
138+
ASSERT_NOT_CONSTEXPR_CXX23(std::truncl(1.0L) == 1.0L);
139+
140+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmod(1.5f, 1.0f) == 0.5f);
141+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmod(1.5, 1.0) == 0.5);
142+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmod(1.5L, 1.0L) == 0.5L);
143+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmodf(1.5f, 1.0f) == 0.5f);
144+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmodl(1.5L, 1.0L) == 0.5L);
145+
146+
ASSERT_NOT_CONSTEXPR_CXX23(std::remainder(0.5f, 1.0f) == 0.5f);
147+
ASSERT_NOT_CONSTEXPR_CXX23(std::remainder(0.5, 1.0) == 0.5);
148+
ASSERT_NOT_CONSTEXPR_CXX23(std::remainder(0.5L, 1.0L) == 0.5L);
149+
ASSERT_NOT_CONSTEXPR_CXX23(std::remainderf(0.5f, 1.0f) == 0.5f);
150+
ASSERT_NOT_CONSTEXPR_CXX23(std::remainderl(0.5L, 1.0L) == 0.5L);
151+
152+
ASSERT_NOT_CONSTEXPR_CXX23(std::remquo(0.5f, 1.0f, &DummyInt) == 0.5f);
153+
ASSERT_NOT_CONSTEXPR_CXX23(std::remquo(0.5, 1.0, &DummyInt) == 0.5);
154+
ASSERT_NOT_CONSTEXPR_CXX23(std::remquo(0.5L, 1.0L, &DummyInt) == 0.5L);
155+
ASSERT_NOT_CONSTEXPR_CXX23(std::remquof(0.5f, 1.0f, &DummyInt) == 0.5f);
156+
ASSERT_NOT_CONSTEXPR_CXX23(std::remquol(0.5L, 1.0L, &DummyInt) == 0.5L);
157+
158+
ASSERT_NOT_CONSTEXPR_CXX23(std::copysign(1.0f, 1.0f) == 1.0f);
159+
ASSERT_NOT_CONSTEXPR_CXX23(std::copysign(1.0, 1.0) == 1.0);
160+
ASSERT_NOT_CONSTEXPR_CXX23(std::copysign(1.0L, 1.0L) == 1.0L);
161+
ASSERT_NOT_CONSTEXPR_CXX23(std::copysignf(1.0f, 1.0f) == 1.0f);
162+
ASSERT_NOT_CONSTEXPR_CXX23(std::copysignl(1.0L, 1.0L) == 1.0L);
163+
164+
ASSERT_NOT_CONSTEXPR_CXX23(std::nextafter(0.0f, 0.0f) == 0.0f);
165+
ASSERT_NOT_CONSTEXPR_CXX23(std::nextafter(0.0, 0.0) == 0.0);
166+
ASSERT_NOT_CONSTEXPR_CXX23(std::nextafter(0.0L, 0.0L) == 0.0L);
167+
ASSERT_NOT_CONSTEXPR_CXX23(std::nextafterf(0.0f, 0.0f) == 0.0f);
168+
ASSERT_NOT_CONSTEXPR_CXX23(std::nextafterl(0.0L, 0.0L) == 0.0L);
169+
170+
ASSERT_NOT_CONSTEXPR_CXX23(std::nexttoward(0.0f, 0.0L) == 0.0f);
171+
ASSERT_NOT_CONSTEXPR_CXX23(std::nexttoward(0.0, 0.0L) == 0.0f);
172+
ASSERT_NOT_CONSTEXPR_CXX23(std::nexttoward(0.0L, 0.0L) == 0.0L);
173+
ASSERT_NOT_CONSTEXPR_CXX23(std::nexttowardf(0.0f, 0.0L) == 0.0f);
174+
ASSERT_NOT_CONSTEXPR_CXX23(std::nexttowardl(0.0L, 0.0L) == 0.0L);
175+
176+
ASSERT_NOT_CONSTEXPR_CXX23(std::fdim(1.0f, 0.0f) == 1.0f);
177+
ASSERT_NOT_CONSTEXPR_CXX23(std::fdim(1.0, 0.0) == 1.0);
178+
ASSERT_NOT_CONSTEXPR_CXX23(std::fdim(1.0L, 0.0L) == 1.0L);
179+
ASSERT_NOT_CONSTEXPR_CXX23(std::fdimf(1.0f, 0.0f) == 1.0f);
180+
ASSERT_NOT_CONSTEXPR_CXX23(std::fdiml(1.0L, 0.0L) == 1.0L);
181+
182+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmax(1.0f, 0.0f) == 1.0f);
183+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmax(1.0, 0.0) == 1.0);
184+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmax(1.0L, 0.0L) == 1.0L);
185+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmaxf(1.0f, 0.0f) == 1.0f);
186+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmaxl(1.0L, 0.0L) == 1.0L);
187+
188+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmin(1.0f, 0.0f) == 0.0f);
189+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmin(1.0, 0.0) == 0.0);
190+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmin(1.0L, 0.0L) == 0.0L);
191+
ASSERT_NOT_CONSTEXPR_CXX23(std::fminf(1.0f, 0.0f) == 0.0f);
192+
ASSERT_NOT_CONSTEXPR_CXX23(std::fminl(1.0L, 0.0L) == 0.0L);
193+
194+
ASSERT_NOT_CONSTEXPR_CXX23(std::fma(1.0f, 1.0f, 1.0f) == 2.0f);
195+
ASSERT_NOT_CONSTEXPR_CXX23(std::fma(1.0, 1.0, 1.0) == 2.0);
196+
ASSERT_NOT_CONSTEXPR_CXX23(std::fma(1.0L, 1.0L, 1.0L) == 2.0L);
197+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmaf(1.0f, 1.0f, 1.0f) == 2.0f);
198+
ASSERT_NOT_CONSTEXPR_CXX23(std::fmal(1.0L, 1.0L, 1.0L) == 2.0L);
199+
200+
ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0f) == FP_NORMAL);
201+
ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0) == FP_NORMAL);
202+
ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0L) == FP_NORMAL);
203+
204+
ASSERT_NOT_CONSTEXPR_CXX23(std::isfinite(-1.0f) == 1);
205+
ASSERT_NOT_CONSTEXPR_CXX23(std::isfinite(-1.0) == 1);
206+
ASSERT_NOT_CONSTEXPR_CXX23(std::isfinite(-1.0L) == 1);
207+
208+
ASSERT_NOT_CONSTEXPR_CXX23(std::isinf(-1.0f) == 0);
209+
ASSERT_NOT_CONSTEXPR_CXX23(std::isinf(-1.0) == 0);
210+
ASSERT_NOT_CONSTEXPR_CXX23(std::isinf(-1.0L) == 0);
211+
212+
ASSERT_NOT_CONSTEXPR_CXX23(std::isnan(-1.0f) == 0);
213+
ASSERT_NOT_CONSTEXPR_CXX23(std::isnan(-1.0) == 0);
214+
ASSERT_NOT_CONSTEXPR_CXX23(std::isnan(-1.0L) == 0);
215+
216+
ASSERT_NOT_CONSTEXPR_CXX23(std::isnormal(-1.0f) == 1);
217+
ASSERT_NOT_CONSTEXPR_CXX23(std::isnormal(-1.0) == 1);
218+
ASSERT_NOT_CONSTEXPR_CXX23(std::isnormal(-1.0L) == 1);
219+
220+
ASSERT_NOT_CONSTEXPR_CXX23(std::signbit(-1.0f) == 1);
221+
ASSERT_NOT_CONSTEXPR_CXX23(std::signbit(-1.0) == 1);
222+
ASSERT_NOT_CONSTEXPR_CXX23(std::signbit(-1.0L) == 1);
223+
224+
ASSERT_NOT_CONSTEXPR_CXX23(std::isgreater(-1.0f, 0.0f) == 0);
225+
ASSERT_NOT_CONSTEXPR_CXX23(std::isgreater(-1.0, 0.0) == 0);
226+
ASSERT_NOT_CONSTEXPR_CXX23(std::isgreater(-1.0L, 0.0L) == 0);
227+
228+
ASSERT_NOT_CONSTEXPR_CXX23(std::isgreaterequal(-1.0f, 0.0f) == 0);
229+
ASSERT_NOT_CONSTEXPR_CXX23(std::isgreaterequal(-1.0, 0.0) == 0);
230+
ASSERT_NOT_CONSTEXPR_CXX23(std::isgreaterequal(-1.0L, 0.0L) == 0);
231+
232+
ASSERT_NOT_CONSTEXPR_CXX23(std::isless(-1.0f, 0.0f) == 1);
233+
ASSERT_NOT_CONSTEXPR_CXX23(std::isless(-1.0, 0.0) == 1);
234+
ASSERT_NOT_CONSTEXPR_CXX23(std::isless(-1.0L, 0.0L) == 1);
235+
236+
ASSERT_NOT_CONSTEXPR_CXX23(std::islessequal(-1.0f, 0.0f) == 1);
237+
ASSERT_NOT_CONSTEXPR_CXX23(std::islessequal(-1.0, 0.0) == 1);
238+
ASSERT_NOT_CONSTEXPR_CXX23(std::islessequal(-1.0L, 0.0L) == 1);
239+
240+
ASSERT_NOT_CONSTEXPR_CXX23(std::islessgreater(-1.0f, 0.0f) == 1);
241+
ASSERT_NOT_CONSTEXPR_CXX23(std::islessgreater(-1.0, 0.0) == 1);
242+
ASSERT_NOT_CONSTEXPR_CXX23(std::islessgreater(-1.0L, 0.0L) == 1);
243+
244+
ASSERT_NOT_CONSTEXPR_CXX23(std::isunordered(-1.0f, 0.0f) == 0);
245+
ASSERT_NOT_CONSTEXPR_CXX23(std::isunordered(-1.0, 0.0) == 0);
246+
ASSERT_NOT_CONSTEXPR_CXX23(std::isunordered(-1.0L, 0.0L) == 0);
247+
248+
assert(!ImplementedP0533R9 && R"(
249+
Congratulations! You just have implemented P0533R9 (https://wg21.link/p0533r9).
250+
Please go to `clang/www/cxx_status.html` and change the paper's implementation
251+
status. Also please delete this assert and refactor `ASSERT_CONSTEXPR_CXX23`
252+
and `ASSERT_NOT_CONSTEXPR_CXX23`.
253+
)");
254+
255+
return 0;
256+
}

0 commit comments

Comments
 (0)