[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

`+

}

`