================ @@ -0,0 +1,57 @@ +// RUN: %clang_cc1 -DWIN -verify -std=c++23 -fsyntax-only %s +// RUN: %clang_cc1 -verify -std=c++23 -fsyntax-only %s + +// expected-no-diagnostics + + +#ifdef WIN +#define INFINITY ((float)(1e+300 * 1e+300)) +#define NAN (-(float)(INFINITY * 0.0F)) +#else +#define NAN (__builtin_nanf("")) +#define INFINITY (__builtin_inff()) +#endif + +extern "C" void abort() noexcept; +extern "C" int write(int, const void*, unsigned long); + +#define assert(condition) \ + do { \ + if (!(condition)) { \ + write(2, "Assertion failed: ", 18); \ + write(2, #condition, sizeof(#condition) - 1); \ + write(2, "\n", 1); \ + abort(); \ + } \ + } while (false) + +int main() { + int i; + + // fmin + static_assert(__builtin_fmin(15.24, 1.3) == 1.3, ""); + static_assert(__builtin_fmin(-0.0, +0.0) == -0.0, ""); + static_assert(__builtin_fmin(+0.0, -0.0) == -0.0, ""); + assert(__builtin_isnan(__builtin_fminf(NAN,NAN))); + assert(__builtin_isnan(__builtin_fminf(NAN, -1))); + assert(__builtin_isnan(__builtin_fminf(-INFINITY, 0))); + assert(__builtin_iszero(__builtin_fminf(+INFINITY, 0))); + + // frexp + static_assert(__builtin_frexp(123.45, &i) == 0.96445312500000002); ---------------- hubert-reinterpretcast wrote:
Here is an example of checking both the fraction and exponent values by "identity" instead of by comparisons. ```cpp template <auto, auto> constexpr bool is_same_val = false; template <auto X> constexpr bool is_same_val<X, X> = true; template <typename T> struct FrexpResult { T fraction; int exponent; }; template <typename T> constexpr auto simulateFrexp(T value) { FrexpResult<T> result; result.fraction = __builtin_frexp(value, &result.exponent); return result; } static_assert(is_same_val<simulateFrexp(1.), FrexpResult{0.5, 1}>); ``` https://godbolt.org/z/Whx6o5Y7E https://github.com/llvm/llvm-project/pull/88978 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits