xref: /llvm-project/clang/test/SemaObjCXX/type-traits-is-pointer.mm (revision b25ec45809fbb71d0db883c0275dc5ddcd61160d)
1// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -fobjc-runtime-has-weak -verify %s
2// expected-no-diagnostics
3
4template <typename T>
5void test_is_pointer() {
6    static_assert(__is_pointer(T), "");
7
8    static_assert(__is_pointer(T __weak), "");
9    static_assert(__is_pointer(T __strong), "");
10    static_assert(__is_pointer(T __autoreleasing), "");
11    static_assert(__is_pointer(T __unsafe_unretained), "");
12
13    static_assert(__is_pointer(T __weak const), "");
14    static_assert(__is_pointer(T __strong const), "");
15    static_assert(__is_pointer(T __autoreleasing const), "");
16    static_assert(__is_pointer(T __unsafe_unretained const), "");
17
18    static_assert(__is_pointer(T __weak volatile), "");
19    static_assert(__is_pointer(T __strong volatile), "");
20    static_assert(__is_pointer(T __autoreleasing volatile), "");
21    static_assert(__is_pointer(T __unsafe_unretained volatile), "");
22
23    static_assert(__is_pointer(T __weak const volatile), "");
24    static_assert(__is_pointer(T __strong const volatile), "");
25    static_assert(__is_pointer(T __autoreleasing const volatile), "");
26    static_assert(__is_pointer(T __unsafe_unretained const volatile), "");
27}
28
29@class Foo;
30
31int main(int, char**) {
32    test_is_pointer<id>();
33    test_is_pointer<id const>();
34    test_is_pointer<id volatile>();
35    test_is_pointer<id const volatile>();
36
37    test_is_pointer<Foo*>();
38    test_is_pointer<Foo const*>();
39    test_is_pointer<Foo volatile*>();
40    test_is_pointer<Foo const volatile*>();
41
42    test_is_pointer<void*>();
43    test_is_pointer<void const*>();
44    test_is_pointer<void volatile*>();
45    test_is_pointer<void const volatile*>();
46
47    return 0;
48}
49