|
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