brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · 6cbeed2 Raw
91 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// template<class T>12// concept signed_integral = // see below13 14#include <concepts>15#include <type_traits>16 17#include "arithmetic.h"18#include "test_macros.h"19 20template <typename T>21constexpr bool CheckSignedIntegralQualifiers() {22  constexpr bool result = std::signed_integral<T>;23  static_assert(std::signed_integral<const T> == result);24  static_assert(std::signed_integral<volatile T> == result);25  static_assert(std::signed_integral<const volatile T> == result);26 27  static_assert(!std::signed_integral<T&>);28  static_assert(!std::signed_integral<const T&>);29  static_assert(!std::signed_integral<volatile T&>);30  static_assert(!std::signed_integral<const volatile T&>);31 32  static_assert(!std::signed_integral<T&&>);33  static_assert(!std::signed_integral<const T&&>);34  static_assert(!std::signed_integral<volatile T&&>);35  static_assert(!std::signed_integral<const volatile T&&>);36 37  static_assert(!std::signed_integral<T*>);38  static_assert(!std::signed_integral<const T*>);39  static_assert(!std::signed_integral<volatile T*>);40  static_assert(!std::signed_integral<const volatile T*>);41 42  static_assert(!std::signed_integral<T (*)()>);43  static_assert(!std::signed_integral<T (&)()>);44  static_assert(!std::signed_integral<T (&&)()>);45 46  return result;47}48 49// standard signed integers50static_assert(CheckSignedIntegralQualifiers<signed char>());51static_assert(CheckSignedIntegralQualifiers<short>());52static_assert(CheckSignedIntegralQualifiers<int>());53static_assert(CheckSignedIntegralQualifiers<long>());54static_assert(CheckSignedIntegralQualifiers<long long>());55 56// bool and character *may* be signed57static_assert(CheckSignedIntegralQualifiers<wchar_t>() == std::is_signed_v<wchar_t>);58static_assert(CheckSignedIntegralQualifiers<bool>() == std::is_signed_v<bool>);59static_assert(CheckSignedIntegralQualifiers<char>() == std::is_signed_v<char>);60static_assert(CheckSignedIntegralQualifiers<char8_t>() == std::is_signed_v<char8_t>);61static_assert(CheckSignedIntegralQualifiers<char16_t>() == std::is_signed_v<char16_t>);62static_assert(CheckSignedIntegralQualifiers<char32_t>() == std::is_signed_v<char32_t>);63 64// integers that aren't signed integrals65static_assert(!CheckSignedIntegralQualifiers<unsigned char>());66static_assert(!CheckSignedIntegralQualifiers<unsigned short>());67static_assert(!CheckSignedIntegralQualifiers<unsigned int>());68static_assert(!CheckSignedIntegralQualifiers<unsigned long>());69static_assert(!CheckSignedIntegralQualifiers<unsigned long long>());70 71// extended integers72#ifndef TEST_HAS_NO_INT12873static_assert(CheckSignedIntegralQualifiers<__int128_t>());74static_assert(!CheckSignedIntegralQualifiers<__uint128_t>());75#endif76 77// types that aren't even integers shouldn't be signed integers!78static_assert(!std::signed_integral<void>);79static_assert(!CheckSignedIntegralQualifiers<float>());80static_assert(!CheckSignedIntegralQualifiers<double>());81static_assert(!CheckSignedIntegralQualifiers<long double>());82 83static_assert(!CheckSignedIntegralQualifiers<ClassicEnum>());84static_assert(!CheckSignedIntegralQualifiers<ScopedEnum>());85static_assert(!CheckSignedIntegralQualifiers<EmptyStruct>());86static_assert(!CheckSignedIntegralQualifiers<int EmptyStruct::*>());87static_assert(!CheckSignedIntegralQualifiers<int (EmptyStruct::*)()>());88 89static_assert(CheckSubsumption(0));90static_assert(CheckSubsumption(0U));91