brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · f48c2cc Raw
105 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_array12 13#include <type_traits>14#include <cstddef>        // for std::nullptr_t15#include "test_macros.h"16 17template <class T>18void test_is_array()19{20    static_assert( std::is_array<T>::value, "");21    static_assert( std::is_array<const T>::value, "");22    static_assert( std::is_array<volatile T>::value, "");23    static_assert( std::is_array<const volatile T>::value, "");24#if TEST_STD_VER > 1425    static_assert( std::is_array_v<T>, "");26    static_assert( std::is_array_v<const T>, "");27    static_assert( std::is_array_v<volatile T>, "");28    static_assert( std::is_array_v<const volatile T>, "");29#endif30}31 32template <class T>33void test_is_not_array()34{35    static_assert(!std::is_array<T>::value, "");36    static_assert(!std::is_array<const T>::value, "");37    static_assert(!std::is_array<volatile T>::value, "");38    static_assert(!std::is_array<const volatile T>::value, "");39#if TEST_STD_VER > 1440    static_assert(!std::is_array_v<T>, "");41    static_assert(!std::is_array_v<const T>, "");42    static_assert(!std::is_array_v<volatile T>, "");43    static_assert(!std::is_array_v<const volatile T>, "");44#endif45}46 47class Empty48{49};50 51class NotEmpty52{53    virtual ~NotEmpty();54};55 56union Union {};57 58struct bit_zero59{60    int :  0;61};62 63class Abstract64{65    virtual ~Abstract() = 0;66};67 68enum Enum {zero, one};69struct incomplete_type;70 71typedef void (*FunctionPtr)();72 73int main(int, char**)74{75    test_is_array<char[3]>();76    // Android clang-r536225 identifies as clang-19.0, but it predates the77    // LLVM 19.0.0 release. It lacks llvm.org/pr86652, which changed __is_array78    // to return false for T[0]. llvm.org/pr93037 relies on that change for79    // correct handling of std::is_array<T[0]>. This test will pass as long as80    // Clang and libc++ come from the same LLVM commit, but we can't detect that81    // here.82#if !defined(__ANDROID__) || TEST_CLANG_VER != 190083    test_is_not_array<char[0]>();84#endif85    test_is_array<char[]>();86    test_is_array<Union[]>();87 88    test_is_not_array<std::nullptr_t>();89    test_is_not_array<void>();90    test_is_not_array<int&>();91    test_is_not_array<int&&>();92    test_is_not_array<int*>();93    test_is_not_array<double>();94    test_is_not_array<const int*>();95    test_is_not_array<Enum>();96    test_is_not_array<Union>();97    test_is_not_array<FunctionPtr>();98    test_is_not_array<Empty>();99    test_is_not_array<bit_zero>();100    test_is_not_array<NotEmpty>();101    test_is_not_array<incomplete_type>();  //  LWG#2582102 103  return 0;104}105