1 // RUN: %clang_cc1 -triple arm64-apple-ios -std=c++17 -Wno-vla -fsyntax-only -verify -fptrauth-intrinsics %s
2 // RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c++17 -Wno-vla -fsyntax-only -verify -fptrauth-intrinsics %s
4 // RUN: %clang_cc1 -triple arm64-apple-ios -std=c++17 -Wno-vla -fsyntax-only -verify -fptrauth-intrinsics -fexperimental-new-constant-interpreter %s
5 // RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c++17 -Wno-vla -fsyntax-only -verify -fptrauth-intrinsics -fexperimental-new-constant-interpreter %s
7 // RUN: not %clang_cc1 -triple arm64-apple-ios -std=c++17 -Wno-vla -fsyntax-only %s 2>&1 | FileCheck %s
8 // CHECK: this target does not support pointer authentication
15 constexpr unsigned dependentOperandDisc() {
16 return __builtin_ptrauth_type_discriminator(T
);
19 void test_builtin_ptrauth_type_discriminator(unsigned s
) {
20 typedef int (S::*MemFnTy
)();
22 int (S::*memFnPtr2
)();
23 constexpr unsigned d0
= __builtin_ptrauth_type_discriminator(MemFnTy
);
24 static_assert(d0
== __builtin_ptrauth_string_discriminator("_ZTSM1SFivE"));
25 static_assert(d0
== 60844);
26 static_assert(__builtin_ptrauth_type_discriminator(int (S::*)()) == d0
);
27 static_assert(__builtin_ptrauth_type_discriminator(decltype(memFnPtr
)) == d0
);
28 static_assert(__builtin_ptrauth_type_discriminator(decltype(memFnPtr2
)) == d0
);
29 static_assert(__builtin_ptrauth_type_discriminator(decltype(&S::foo
)) == d0
);
30 static_assert(dependentOperandDisc
<decltype(&S::foo
)>() == d0
);
32 constexpr unsigned d1
= __builtin_ptrauth_type_discriminator(void (S::*)(int));
33 static_assert(__builtin_ptrauth_string_discriminator("_ZTSM1SFviE") == d1
);
34 static_assert(d1
== 39121);
36 constexpr unsigned d2
= __builtin_ptrauth_type_discriminator(void (S::*)(float));
37 static_assert(__builtin_ptrauth_string_discriminator("_ZTSM1SFvfE") == d2
);
38 static_assert(d2
== 52453);
40 constexpr unsigned d3
= __builtin_ptrauth_type_discriminator(int (*())[s
]);
41 static_assert(__builtin_ptrauth_string_discriminator("FPE") == d3
);
42 static_assert(d3
== 34128);
45 constexpr unsigned d4
= __builtin_ptrauth_type_discriminator(decltype(f4
));
46 static_assert(__builtin_ptrauth_type_discriminator(int (*)(float)) == d4
);
47 static_assert(__builtin_ptrauth_string_discriminator("FifE") == d4
);
48 static_assert(d4
== 48468);
51 constexpr unsigned d5
= __builtin_ptrauth_type_discriminator(decltype(f5
));
52 static_assert(__builtin_ptrauth_type_discriminator(int (*)(int)) == d5
);
53 static_assert(__builtin_ptrauth_type_discriminator(short (*)(short)) == d5
);
54 static_assert(__builtin_ptrauth_type_discriminator(char (*)(char)) == d5
);
55 static_assert(__builtin_ptrauth_type_discriminator(long (*)(long)) == d5
);
56 static_assert(__builtin_ptrauth_type_discriminator(unsigned int (*)(unsigned int)) == d5
);
57 static_assert(__builtin_ptrauth_type_discriminator(int (&)(int)) == d5
);
58 static_assert(__builtin_ptrauth_string_discriminator("FiiE") == d5
);
59 static_assert(d5
== 2981);
63 (void)__builtin_ptrauth_type_discriminator(t
); // expected-error {{unknown type name 't'}}
64 (void)__builtin_ptrauth_type_discriminator(&t
); // expected-error {{expected a type}}
65 (void)__builtin_ptrauth_type_discriminator(decltype(vmarray
)); // expected-error {{cannot pass undiscriminated type 'decltype(vmarray)' (aka 'int[s]')}}
66 (void)__builtin_ptrauth_type_discriminator(int *); // expected-error {{cannot pass undiscriminated type 'int *' to '__builtin_ptrauth_type_discriminator'}}
67 (void)__builtin_ptrauth_type_discriminator(); // expected-error {{expected a type}}
68 (void)__builtin_ptrauth_type_discriminator(int (*)(int), int (*)(int));
69 // expected-error@-1 {{expected ')'}}
70 // expected-note@-2 {{to match this '('}}