80 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
// UNSUPPORTED: c++03, c++11, c++14, c++17
 | 
						|
// UNSUPPORTED: libcpp-no-concepts
 | 
						|
 | 
						|
// template<class T>
 | 
						|
// concept floating_point = // see below
 | 
						|
 | 
						|
#include <concepts>
 | 
						|
#include <type_traits>
 | 
						|
 | 
						|
#include "arithmetic.h"
 | 
						|
 | 
						|
template <typename T>
 | 
						|
constexpr bool CheckFloatingPointQualifiers() {
 | 
						|
  constexpr bool result = std::floating_point<T>;
 | 
						|
  static_assert(std::floating_point<const T> == result);
 | 
						|
  static_assert(std::floating_point<volatile T> == result);
 | 
						|
  static_assert(std::floating_point<const volatile T> == result);
 | 
						|
 | 
						|
  static_assert(!std::floating_point<T&>);
 | 
						|
  static_assert(!std::floating_point<const T&>);
 | 
						|
  static_assert(!std::floating_point<volatile T&>);
 | 
						|
  static_assert(!std::floating_point<const volatile T&>);
 | 
						|
 | 
						|
  static_assert(!std::floating_point<T&&>);
 | 
						|
  static_assert(!std::floating_point<const T&&>);
 | 
						|
  static_assert(!std::floating_point<volatile T&&>);
 | 
						|
  static_assert(!std::floating_point<const volatile T&&>);
 | 
						|
 | 
						|
  static_assert(!std::floating_point<T*>);
 | 
						|
  static_assert(!std::floating_point<const T*>);
 | 
						|
  static_assert(!std::floating_point<volatile T*>);
 | 
						|
  static_assert(!std::floating_point<const volatile T*>);
 | 
						|
 | 
						|
  static_assert(!std::floating_point<T (*)()>);
 | 
						|
  static_assert(!std::floating_point<T (&)()>);
 | 
						|
  static_assert(!std::floating_point<T(&&)()>);
 | 
						|
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
// floating-point types
 | 
						|
static_assert(CheckFloatingPointQualifiers<float>());
 | 
						|
static_assert(CheckFloatingPointQualifiers<double>());
 | 
						|
static_assert(CheckFloatingPointQualifiers<long double>());
 | 
						|
 | 
						|
// types that aren't floating-point
 | 
						|
static_assert(!CheckFloatingPointQualifiers<signed char>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<unsigned char>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<short>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<unsigned short>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<int>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<unsigned int>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<long>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<unsigned long>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<long long>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<unsigned long long>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<wchar_t>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<bool>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<char>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<char8_t>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<char16_t>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<char32_t>());
 | 
						|
static_assert(!std::floating_point<void>);
 | 
						|
 | 
						|
static_assert(!CheckFloatingPointQualifiers<ClassicEnum>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<ScopedEnum>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<EmptyStruct>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<int EmptyStruct::*>());
 | 
						|
static_assert(!CheckFloatingPointQualifiers<int (EmptyStruct::*)()>());
 | 
						|
 | 
						|
int main(int, char**) { return 0; }
 |