[clang][PAC] Don't try to diagnose use of pointer auth on dependent t… · llvm/llvm-project@a867bd5 (original) (raw)
`@@ -8,13 +8,14 @@
`
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 struct B {
`
``
410
`+
class C : A {
`
``
411
`+
A a[N];
`
``
412
`+
} d;
`
``
413
`+
};
`
``
414
+
``
415
`+
template 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 using Ptr = T * __ptrauth(1,1,1);
`
``
426
`+
template void test() {
`
``
427
`+
static_assert(PTRAUTH_ENABLED != __is_trivially_copyable(Ptr));
`
``
428
`+
}
`
``
429
+
``
430
`+
auto f = test;
`
``
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
`+
}
`