117 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_fundamental12 13#include <type_traits>14#include <cstddef> // for std::nullptr_t15#include "test_macros.h"16 17template <class T>18void test_is_fundamental()19{20 static_assert( std::is_fundamental<T>::value, "");21 static_assert( std::is_fundamental<const T>::value, "");22 static_assert( std::is_fundamental<volatile T>::value, "");23 static_assert( std::is_fundamental<const volatile T>::value, "");24#if TEST_STD_VER > 1425 static_assert( std::is_fundamental_v<T>, "");26 static_assert( std::is_fundamental_v<const T>, "");27 static_assert( std::is_fundamental_v<volatile T>, "");28 static_assert( std::is_fundamental_v<const volatile T>, "");29#endif30}31 32template <class T>33void test_is_not_fundamental()34{35 static_assert(!std::is_fundamental<T>::value, "");36 static_assert(!std::is_fundamental<const T>::value, "");37 static_assert(!std::is_fundamental<volatile T>::value, "");38 static_assert(!std::is_fundamental<const volatile T>::value, "");39#if TEST_STD_VER > 1440 static_assert(!std::is_fundamental_v<T>, "");41 static_assert(!std::is_fundamental_v<const T>, "");42 static_assert(!std::is_fundamental_v<volatile T>, "");43 static_assert(!std::is_fundamental_v<const volatile T>, "");44#endif45}46 47class incomplete_type;48 49class Empty50{51};52 53class NotEmpty54{55 virtual ~NotEmpty();56};57 58union Union {};59 60struct bit_zero61{62 int : 0;63};64 65class Abstract66{67 virtual ~Abstract() = 0;68};69 70enum Enum {zero, one};71 72typedef void (*FunctionPtr)();73 74 75int main(int, char**)76{77 test_is_fundamental<std::nullptr_t>();78 test_is_fundamental<void>();79 test_is_fundamental<short>();80 test_is_fundamental<unsigned short>();81 test_is_fundamental<int>();82 test_is_fundamental<unsigned int>();83 test_is_fundamental<long>();84 test_is_fundamental<unsigned long>();85 test_is_fundamental<long long>();86 test_is_fundamental<unsigned long long>();87 test_is_fundamental<bool>();88 test_is_fundamental<char>();89 test_is_fundamental<signed char>();90 test_is_fundamental<unsigned char>();91 test_is_fundamental<wchar_t>();92 test_is_fundamental<double>();93 test_is_fundamental<float>();94 test_is_fundamental<double>();95 test_is_fundamental<long double>();96 test_is_fundamental<char16_t>();97 test_is_fundamental<char32_t>();98 99 test_is_not_fundamental<char[3]>();100 test_is_not_fundamental<char[]>();101 test_is_not_fundamental<void *>();102 test_is_not_fundamental<FunctionPtr>();103 test_is_not_fundamental<int&>();104 test_is_not_fundamental<int&&>();105 test_is_not_fundamental<Union>();106 test_is_not_fundamental<Empty>();107 test_is_not_fundamental<incomplete_type>();108 test_is_not_fundamental<bit_zero>();109 test_is_not_fundamental<int*>();110 test_is_not_fundamental<const int*>();111 test_is_not_fundamental<Enum>();112 test_is_not_fundamental<NotEmpty>();113 test_is_not_fundamental<Abstract>();114 115 return 0;116}117