1*df9167bfSStephan T. Lavavej //===----------------------------------------------------------------------===// 2*df9167bfSStephan T. Lavavej // 3*df9167bfSStephan T. Lavavej // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*df9167bfSStephan T. Lavavej // See https://llvm.org/LICENSE.txt for license information. 5*df9167bfSStephan T. Lavavej // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*df9167bfSStephan T. Lavavej // 7*df9167bfSStephan T. Lavavej //===----------------------------------------------------------------------===// 8*df9167bfSStephan T. Lavavej 9*df9167bfSStephan T. Lavavej // UNSUPPORTED: c++03, c++11, c++14, c++17 10*df9167bfSStephan T. Lavavej 11*df9167bfSStephan T. Lavavej // template<class T> 12*df9167bfSStephan T. Lavavej // concept floating_point = // see below 13*df9167bfSStephan T. Lavavej 14*df9167bfSStephan T. Lavavej #include <concepts> 15*df9167bfSStephan T. Lavavej #include <type_traits> 16*df9167bfSStephan T. Lavavej 17*df9167bfSStephan T. Lavavej #include "arithmetic.h" 18*df9167bfSStephan T. Lavavej 19*df9167bfSStephan T. Lavavej template <typename T> CheckFloatingPointQualifiers()20*df9167bfSStephan T. Lavavejconstexpr bool CheckFloatingPointQualifiers() { 21*df9167bfSStephan T. Lavavej constexpr bool result = std::floating_point<T>; 22*df9167bfSStephan T. Lavavej static_assert(std::floating_point<const T> == result); 23*df9167bfSStephan T. Lavavej static_assert(std::floating_point<volatile T> == result); 24*df9167bfSStephan T. Lavavej static_assert(std::floating_point<const volatile T> == result); 25*df9167bfSStephan T. Lavavej 26*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<T&>); 27*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<const T&>); 28*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<volatile T&>); 29*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<const volatile T&>); 30*df9167bfSStephan T. Lavavej 31*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<T&&>); 32*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<const T&&>); 33*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<volatile T&&>); 34*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<const volatile T&&>); 35*df9167bfSStephan T. Lavavej 36*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<T*>); 37*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<const T*>); 38*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<volatile T*>); 39*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<const volatile T*>); 40*df9167bfSStephan T. Lavavej 41*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<T (*)()>); 42*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<T (&)()>); 43*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<T (&&)()>); 44*df9167bfSStephan T. Lavavej 45*df9167bfSStephan T. Lavavej return result; 46*df9167bfSStephan T. Lavavej } 47*df9167bfSStephan T. Lavavej 48*df9167bfSStephan T. Lavavej // floating-point types 49*df9167bfSStephan T. Lavavej static_assert(CheckFloatingPointQualifiers<float>()); 50*df9167bfSStephan T. Lavavej static_assert(CheckFloatingPointQualifiers<double>()); 51*df9167bfSStephan T. Lavavej static_assert(CheckFloatingPointQualifiers<long double>()); 52*df9167bfSStephan T. Lavavej 53*df9167bfSStephan T. Lavavej // types that aren't floating-point 54*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<signed char>()); 55*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<unsigned char>()); 56*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<short>()); 57*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<unsigned short>()); 58*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<int>()); 59*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<unsigned int>()); 60*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<long>()); 61*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<unsigned long>()); 62*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<long long>()); 63*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<unsigned long long>()); 64*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<wchar_t>()); 65*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<bool>()); 66*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<char>()); 67*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<char8_t>()); 68*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<char16_t>()); 69*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<char32_t>()); 70*df9167bfSStephan T. Lavavej static_assert(!std::floating_point<void>); 71*df9167bfSStephan T. Lavavej 72*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<ClassicEnum>()); 73*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<ScopedEnum>()); 74*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<EmptyStruct>()); 75*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<int EmptyStruct::*>()); 76*df9167bfSStephan T. Lavavej static_assert(!CheckFloatingPointQualifiers<int (EmptyStruct::*)()>()); 77