131 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// type_traits10 11// is_unsigned12 13#include <type_traits>14#include <cstddef>15 16#include "test_macros.h"17 18template <class T>19void test_is_unsigned()20{21 static_assert( std::is_unsigned<T>::value, "");22 static_assert( std::is_unsigned<const T>::value, "");23 static_assert( std::is_unsigned<volatile T>::value, "");24 static_assert( std::is_unsigned<const volatile T>::value, "");25#if TEST_STD_VER > 1426 static_assert( std::is_unsigned_v<T>, "");27 static_assert( std::is_unsigned_v<const T>, "");28 static_assert( std::is_unsigned_v<volatile T>, "");29 static_assert( std::is_unsigned_v<const volatile T>, "");30#endif31}32 33template <class T>34void test_is_not_unsigned()35{36 static_assert(!std::is_unsigned<T>::value, "");37 static_assert(!std::is_unsigned<const T>::value, "");38 static_assert(!std::is_unsigned<volatile T>::value, "");39 static_assert(!std::is_unsigned<const volatile T>::value, "");40#if TEST_STD_VER > 1441 static_assert(!std::is_unsigned_v<T>, "");42 static_assert(!std::is_unsigned_v<const T>, "");43 static_assert(!std::is_unsigned_v<volatile T>, "");44 static_assert(!std::is_unsigned_v<const volatile T>, "");45#endif46}47 48class Class49{50public:51 ~Class();52};53 54struct A; // incomplete55 56class incomplete_type;57 58class Empty {};59 60class NotEmpty {61 virtual ~NotEmpty();62};63 64union Union {};65 66struct bit_zero {67 int : 0;68};69 70class Abstract {71 virtual ~Abstract() = 0;72};73 74enum Enum { zero, one };75 76enum EnumSigned : int { two };77 78enum EnumUnsigned : unsigned { three };79 80enum class EnumClass { zero, one };81 82typedef void (*FunctionPtr)();83 84int main(int, char**)85{86 // Cases where !is_arithmetic implies !is_unsigned87 test_is_not_unsigned<std::nullptr_t>();88 test_is_not_unsigned<void>();89 test_is_not_unsigned<int&>();90 test_is_not_unsigned<int&&>();91 test_is_not_unsigned<Class>();92 test_is_not_unsigned<int*>();93 test_is_not_unsigned<const int*>();94 test_is_not_unsigned<char[3]>();95 test_is_not_unsigned<char[]>();96 test_is_not_unsigned<Union>();97 test_is_not_unsigned<Enum>();98 test_is_not_unsigned<EnumSigned>();99 test_is_not_unsigned<EnumUnsigned>();100 test_is_not_unsigned<EnumClass>();101 test_is_not_unsigned<FunctionPtr>();102 test_is_not_unsigned<Empty>();103 test_is_not_unsigned<incomplete_type>();104 test_is_not_unsigned<A>();105 test_is_not_unsigned<bit_zero>();106 test_is_not_unsigned<NotEmpty>();107 test_is_not_unsigned<Abstract>();108 109 test_is_not_unsigned<signed char>();110 test_is_not_unsigned<short>();111 test_is_not_unsigned<int>();112 test_is_not_unsigned<long>();113 test_is_not_unsigned<float>();114 test_is_not_unsigned<double>();115 116 test_is_unsigned<unsigned char>();117 test_is_unsigned<unsigned short>();118 test_is_unsigned<unsigned int>();119 test_is_unsigned<unsigned long>();120 121 test_is_unsigned<bool>();122 test_is_unsigned<unsigned>();123 124#ifndef TEST_HAS_NO_INT128125 test_is_unsigned<__uint128_t>();126 test_is_not_unsigned<__int128_t>();127#endif128 129 return 0;130}131