90 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 unsigned_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 CheckUnsignedIntegralQualifiers() {22 constexpr bool result = std::unsigned_integral<T>;23 static_assert(std::unsigned_integral<const T> == result);24 static_assert(std::unsigned_integral<volatile T> == result);25 static_assert(std::unsigned_integral<const volatile T> == result);26 27 static_assert(!std::unsigned_integral<T&>);28 static_assert(!std::unsigned_integral<const T&>);29 static_assert(!std::unsigned_integral<volatile T&>);30 static_assert(!std::unsigned_integral<const volatile T&>);31 32 static_assert(!std::unsigned_integral<T&&>);33 static_assert(!std::unsigned_integral<const T&&>);34 static_assert(!std::unsigned_integral<volatile T&&>);35 static_assert(!std::unsigned_integral<const volatile T&&>);36 37 static_assert(!std::unsigned_integral<T*>);38 static_assert(!std::unsigned_integral<const T*>);39 static_assert(!std::unsigned_integral<volatile T*>);40 static_assert(!std::unsigned_integral<const volatile T*>);41 42 static_assert(!std::unsigned_integral<T (*)()>);43 static_assert(!std::unsigned_integral<T (&)()>);44 static_assert(!std::unsigned_integral<T (&&)()>);45 46 return result;47}48 49// standard unsigned types50static_assert(CheckUnsignedIntegralQualifiers<unsigned char>());51static_assert(CheckUnsignedIntegralQualifiers<unsigned short>());52static_assert(CheckUnsignedIntegralQualifiers<unsigned int>());53static_assert(CheckUnsignedIntegralQualifiers<unsigned long>());54static_assert(CheckUnsignedIntegralQualifiers<unsigned long long>());55 56// Whether bool and character types are signed or unsigned is impl-defined57static_assert(CheckUnsignedIntegralQualifiers<wchar_t>() == !std::is_signed_v<wchar_t>);58static_assert(CheckUnsignedIntegralQualifiers<bool>() == !std::is_signed_v<bool>);59static_assert(CheckUnsignedIntegralQualifiers<char>() == !std::is_signed_v<char>);60static_assert(CheckUnsignedIntegralQualifiers<char8_t>() == !std::is_signed_v<char8_t>);61static_assert(CheckUnsignedIntegralQualifiers<char16_t>() == !std::is_signed_v<char16_t>);62static_assert(CheckUnsignedIntegralQualifiers<char32_t>() == !std::is_signed_v<char32_t>);63 64// extended integers65#ifndef TEST_HAS_NO_INT12866static_assert(CheckUnsignedIntegralQualifiers<__uint128_t>());67static_assert(!CheckUnsignedIntegralQualifiers<__int128_t>());68#endif69 70// integer types that aren't unsigned integrals71static_assert(!CheckUnsignedIntegralQualifiers<signed char>());72static_assert(!CheckUnsignedIntegralQualifiers<short>());73static_assert(!CheckUnsignedIntegralQualifiers<int>());74static_assert(!CheckUnsignedIntegralQualifiers<long>());75static_assert(!CheckUnsignedIntegralQualifiers<long long>());76 77static_assert(!std::unsigned_integral<void>);78static_assert(!CheckUnsignedIntegralQualifiers<float>());79static_assert(!CheckUnsignedIntegralQualifiers<double>());80static_assert(!CheckUnsignedIntegralQualifiers<long double>());81 82static_assert(!CheckUnsignedIntegralQualifiers<ClassicEnum>());83static_assert(!CheckUnsignedIntegralQualifiers<ScopedEnum>());84static_assert(!CheckUnsignedIntegralQualifiers<EmptyStruct>());85static_assert(!CheckUnsignedIntegralQualifiers<int EmptyStruct::*>());86static_assert(!CheckUnsignedIntegralQualifiers<int (EmptyStruct::*)()>());87 88static_assert(CheckSubsumption(0));89static_assert(CheckSubsumption(0U));90