110 lines · cpp
1// RUN: %clang_cc1 -triple arm64 -fptrauth-calls -fptrauth-intrinsics -std=c++26 -verify %s2 3// This test intentionally does not enable the global address discrimination4// of vtable pointers. This lets us configure them with different schemas5// and verify that we're correctly tracking the existence of address discrimination6 7// expected-no-diagnostics8 9struct NonAddressDiscPtrauth {10 void * __ptrauth(1, 0, 1234) p;11};12 13static_assert(__builtin_is_cpp_trivially_relocatable(NonAddressDiscPtrauth));14 15struct AddressDiscPtrauth {16 void * __ptrauth(1, 1, 1234) p;17};18 19static_assert(!__builtin_is_cpp_trivially_relocatable(AddressDiscPtrauth));20 21struct MultipleBaseClasses : NonAddressDiscPtrauth, AddressDiscPtrauth {22 23};24 25static_assert(!__builtin_is_cpp_trivially_relocatable(MultipleBaseClasses));26 27struct MultipleMembers1 {28 NonAddressDiscPtrauth field0;29 AddressDiscPtrauth field1;30};31 32static_assert(!__builtin_is_cpp_trivially_relocatable(MultipleMembers1));33 34struct MultipleMembers2 {35 NonAddressDiscPtrauth field0;36 NonAddressDiscPtrauth field1;37};38 39static_assert(__builtin_is_cpp_trivially_relocatable(MultipleMembers2));40 41struct UnionOfPtrauth {42 union {43 NonAddressDiscPtrauth field0;44 AddressDiscPtrauth field1;45 } u;46};47 48static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfPtrauth));49 50struct [[clang::ptrauth_vtable_pointer(process_independent,address_discrimination,no_extra_discrimination)]] Polymorphic trivially_relocatable_if_eligible {51 virtual ~Polymorphic();52};53 54struct Foo : Polymorphic {55 Foo(const Foo&);56 ~Foo();57};58 59 60static_assert(!__builtin_is_cpp_trivially_relocatable(Polymorphic));61 62struct [[clang::ptrauth_vtable_pointer(process_independent,no_address_discrimination,no_extra_discrimination)]] NonAddressDiscriminatedPolymorphic trivially_relocatable_if_eligible {63 virtual ~NonAddressDiscriminatedPolymorphic();64};65 66static_assert(__builtin_is_cpp_trivially_relocatable(NonAddressDiscriminatedPolymorphic));67 68 69struct PolymorphicMembers {70 Polymorphic field;71};72 73static_assert(!__builtin_is_cpp_trivially_relocatable(PolymorphicMembers));74 75struct UnionOfPolymorphic {76 union trivially_relocatable_if_eligible {77 Polymorphic p;78 int i;79 } u;80};81 82static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfPolymorphic));83 84 85struct UnionOfNonAddressDiscriminatedPolymorphic {86 union trivially_relocatable_if_eligible {87 NonAddressDiscriminatedPolymorphic p;88 int i;89 } u;90};91static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfNonAddressDiscriminatedPolymorphic));92 93struct UnionOfNonAddressDiscriminatedPtrauth {94 union {95 NonAddressDiscPtrauth p;96 int i;97 } u;98};99 100static_assert(__builtin_is_cpp_trivially_relocatable(UnionOfNonAddressDiscriminatedPtrauth));101 102struct UnionOfAddressDisriminatedPtrauth {103 union {104 AddressDiscPtrauth p;105 int i;106 } u;107};108 109static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfAddressDisriminatedPtrauth));110