| // RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics -fsyntax-only -verify=c,expected %s |
| // RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics -fsyntax-only -verify=c,expected %s |
| // RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics -fsyntax-only -x c++ -verify=cxx,expected %s |
| // RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics -fsyntax-only -x c++ -verify=cxx,expected %s |
| |
| #if defined __cplusplus |
| extern "C" { |
| #endif |
| |
| void *memset(void *, int, __SIZE_TYPE__); |
| void bzero(void *, __SIZE_TYPE__); |
| void *memcpy(void *, const void *, __SIZE_TYPE__); |
| void *memmove(void *, const void *, __SIZE_TYPE__); |
| |
| #if defined __cplusplus |
| } |
| #endif |
| |
| #define AQ __ptrauth(1,1,50) |
| #define IQ __ptrauth(1,0,50) |
| |
| struct PtrAuthTrivial { |
| int f0; |
| int * IQ f1; |
| }; |
| |
| struct PtrAuthNonTrivial0 { |
| int f0; |
| int * AQ f1; // c-note 2 {{non-trivial to copy}} |
| int f2; |
| }; |
| |
| struct PtrAuthNonTrivial1 { |
| int * AQ f0; // c-note 2 {{non-trivial to copy}} |
| int f1; |
| struct PtrAuthNonTrivial0 f2; |
| }; |
| |
| void testPtrAuthTrivial(struct PtrAuthTrivial *d, struct PtrAuthTrivial *s) { |
| memset(d, 0, sizeof(struct PtrAuthTrivial)); |
| memset(d, 1, sizeof(struct PtrAuthTrivial)); |
| bzero(d, sizeof(struct PtrAuthTrivial)); |
| memcpy(d, s, sizeof(struct PtrAuthTrivial)); |
| memmove(d, s, sizeof(struct PtrAuthTrivial)); |
| } |
| |
| void testPtrAuthNonTrivial1(struct PtrAuthNonTrivial1 *d, |
| struct PtrAuthNonTrivial1 *s) { |
| memset(d, 0, sizeof(struct PtrAuthNonTrivial1)); // cxx-warning {{is a pointer to non-trivially copyable type 'struct PtrAuthNonTrivial1'}} // cxx-note {{explicitly cast the pointer to silence}} |
| memset(d, 1, sizeof(struct PtrAuthNonTrivial1)); // cxx-warning {{is a pointer to non-trivially copyable type 'struct PtrAuthNonTrivial1'}} // cxx-note {{explicitly cast the pointer to silence}} |
| bzero(d, sizeof(struct PtrAuthNonTrivial1)); // cxx-warning {{is a pointer to non-trivially copyable type 'struct PtrAuthNonTrivial1'}} // cxx-note {{explicitly cast the pointer to silence}} |
| memcpy(d, s, sizeof(struct PtrAuthNonTrivial1)); |
| // c-warning@-1 {{that is not trivial to primitive-copy}} |
| // cxx-warning@-2 {{is a pointer to non-trivially copyable type 'struct PtrAuthNonTrivial1'}} |
| // expected-note@-3 {{explicitly cast the pointer to silence}} |
| memmove(d, s, sizeof(struct PtrAuthNonTrivial1)); |
| // c-warning@-1 {{that is not trivial to primitive-copy}} |
| // cxx-warning@-2 {{is a pointer to non-trivially copyable type 'struct PtrAuthNonTrivial1'}} |
| // expected-note@-3 {{explicitly cast the pointer to silence}} |
| } |