|
8 | 8 | // expected-no-diagnostics |
9 | 9 |
|
10 | 10 | #ifdef __PTRAUTH__ |
11 | | - |
| 11 | +#define PTRAUTH_ENABLED 1 |
12 | 12 | #define NonAddressDiscriminatedVTablePtrAttr \ |
13 | 13 | [[clang::ptrauth_vtable_pointer(process_independent, no_address_discrimination, no_extra_discrimination)]] |
14 | 14 | #define AddressDiscriminatedVTablePtrAttr \ |
15 | 15 | [[clang::ptrauth_vtable_pointer(process_independent, address_discrimination, no_extra_discrimination)]] |
16 | 16 | #define ADDR_DISC_ENABLED true |
17 | 17 | #else |
| 18 | +#define PTRAUTH_ENABLED 0 |
18 | 19 | #define NonAddressDiscriminatedVTablePtrAttr |
19 | 20 | #define AddressDiscriminatedVTablePtrAttr |
20 | 21 | #define ADDR_DISC_ENABLED false |
@@ -399,3 +400,38 @@ static_assert(!ASSIGNABLE_WRAPPER(RelocatableAddressDiscriminatedPrimaryBase)); |
399 | 400 | static_assert(!ASSIGNABLE_WRAPPER(RelocatableAddressDiscriminatedSecondaryBase)); |
400 | 401 | static_assert(!ASSIGNABLE_WRAPPER(EmbdeddedAddressDiscriminatedPolymorphicClass)); |
401 | 402 | static_assert(!ASSIGNABLE_WRAPPER(RelocatableEmbdeddedAddressDiscriminatedPolymorphicClass)); |
| 403 | + |
| 404 | +namespace GH159505 { |
| 405 | + class A { |
| 406 | + virtual void f(); |
| 407 | + }; |
| 408 | + |
| 409 | + template <int N> struct B { |
| 410 | + class C : A { |
| 411 | + A a[N]; |
| 412 | + } d; |
| 413 | + }; |
| 414 | + |
| 415 | + template <int N> struct C { |
| 416 | + void *__ptrauth(1,1,1) ptr[N]; |
| 417 | + static_assert(PTRAUTH_ENABLED != __is_trivially_copyable(decltype(ptr))); |
| 418 | + }; |
| 419 | + template <class T, bool isPtrauth> struct D { |
| 420 | + T ptr; |
| 421 | + static_assert(isPtrauth != __is_trivially_copyable(decltype(ptr))); |
| 422 | + }; |
| 423 | + |
| 424 | + |
| 425 | + template <class T> using Ptr = T * __ptrauth(1,1,1); |
| 426 | + template <class T> void test() { |
| 427 | + static_assert(PTRAUTH_ENABLED != __is_trivially_copyable(Ptr<T>)); |
| 428 | + } |
| 429 | + |
| 430 | + auto f = test<int>; |
| 431 | + static_assert(!__is_trivially_copyable(B<1>)); |
| 432 | + static_assert(PTRAUTH_ENABLED != __is_trivially_copyable(C<1>)); |
| 433 | + |
| 434 | + |
| 435 | + D<void *, false> d_void; |
| 436 | + D<void * __ptrauth(1,1,1), PTRAUTH_ENABLED> d_void_ptrauth; |
| 437 | +} |
0 commit comments