| // 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}} | 
 | } |