brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · aa986dd Raw
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