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