================ @@ -0,0 +1,273 @@ +// RUN: %clang_cc1 -x c++ -verify -triple powerpc64le-unknown-unknown %s \ +// RUN: -menable-no-infs -menable-no-nans -DFAST=1 + +// RUN: %clang_cc1 -x c++ -verify -triple powerpc64le-unknown-unknown %s \ +// RUN: -DNOFAST=1 + +// RUN: %clang_cc1 -x c++ -verify -triple powerpc64le-unknown-unknown %s \ +// RUN: -menable-no-infs -DNO_INFS=1 + +// RUN: %clang_cc1 -x c++ -verify -triple powerpc64le-unknown-unknown %s \ +// RUN: -menable-no-nans -DNO_NANS=1 + +int isunorderedf (float x, float y); +#if NOFAST +// expected-no-diagnostics +#endif +extern "C++" { +namespace std __attribute__((__visibility__("default"))) { + bool + isinf(float __x); + bool + isinf(double __x); + bool + isinf(long double __x); + bool + isnan(float __x); + bool + isnan(double __x); + bool + isnan(long double __x); +bool + isfinite(float __x); + bool + isfinite(double __x); + bool + isfinte(long double __x); + bool + isunordered(float __x, float __y); + bool + isunordered(double __x, double __y); + bool + isunordered(long double __x, long double __y); +} // namespace ) +} + +#define NAN (__builtin_nanf("")) +#define INFINITY (__builtin_inff()) + +template <class _Ty> +class numeric_limits { +public: + [[nodiscard]] static constexpr _Ty infinity() noexcept { + return _Ty(); + } +}; + +template <> +class numeric_limits<float> { +public: + [[nodiscard]] static constexpr float infinity() noexcept { + return __builtin_huge_val(); + } +}; +template <> +class numeric_limits<double> { +public: + [[nodiscard]] static constexpr double infinity() noexcept { + return __builtin_huge_val(); + } +}; + +int compareit(float a, float b) { + volatile int i, j, k, l, m, n, o, p; +#if FAST +// expected-warning@+5 {{use of infinity via a macro results in undefined behavior due to the currently enabled floating-point options}} +#endif +#if NO_INFS +// expected-warning@+2 {{use of infinity via a macro results in undefined behavior due to the currently enabled floating-point options}} +#endif ---------------- AaronBallman wrote:
Rather than use the preprocessor to have conditional diagnostics, it's better to use diagnostics with different prefixes. e.g., ``` // RUN: %clang_cc1 -x c++ -verify=no-inf,no-nan -triple powerpc64le-unknown-unknown %s \ // RUN: -menable-no-infs -menable-no-nans // RUN: %clang_cc1 -x c++ -verify=no-inf -triple powerpc64le-unknown-unknown %s \ // RUN: -menable-no-infs // RUN: %clang_cc1 -x c++ -verify=no-nan -triple powerpc64le-unknown-unknown %s \ // RUN: -menable-no-nans ... i = a == INFINITY; // no-inf-warning {{blah blah blah}} ``` https://github.com/llvm/llvm-project/pull/76873 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits