// RUN: %clang_cc1 -triple arm64 -fptrauth-calls -fptrauth-intrinsics -std=c++26 -verify %s // This test intentionally does not enable the global address discrimination // of vtable pointers. This lets us configure them with different schemas // and verify that we're correctly tracking the existence of address discrimination // expected-no-diagnostics struct NonAddressDiscPtrauth { void * __ptrauth(1, 0, 1234) p; }; static_assert(__builtin_is_cpp_trivially_relocatable(NonAddressDiscPtrauth)); struct AddressDiscPtrauth { void * __ptrauth(1, 1, 1234) p; }; static_assert(!__builtin_is_cpp_trivially_relocatable(AddressDiscPtrauth)); struct MultipleBaseClasses : NonAddressDiscPtrauth, AddressDiscPtrauth { }; static_assert(!__builtin_is_cpp_trivially_relocatable(MultipleBaseClasses)); struct MultipleMembers1 { NonAddressDiscPtrauth field0; AddressDiscPtrauth field1; }; static_assert(!__builtin_is_cpp_trivially_relocatable(MultipleMembers1)); struct MultipleMembers2 { NonAddressDiscPtrauth field0; NonAddressDiscPtrauth field1; }; static_assert(__builtin_is_cpp_trivially_relocatable(MultipleMembers2)); struct UnionOfPtrauth { union { NonAddressDiscPtrauth field0; AddressDiscPtrauth field1; } u; }; static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfPtrauth)); struct [[clang::ptrauth_vtable_pointer(process_independent,address_discrimination,no_extra_discrimination)]] Polymorphic trivially_relocatable_if_eligible { virtual ~Polymorphic(); }; struct Foo : Polymorphic { Foo(const Foo&); ~Foo(); }; static_assert(!__builtin_is_cpp_trivially_relocatable(Polymorphic)); struct [[clang::ptrauth_vtable_pointer(process_independent,no_address_discrimination,no_extra_discrimination)]] NonAddressDiscriminatedPolymorphic trivially_relocatable_if_eligible { virtual ~NonAddressDiscriminatedPolymorphic(); }; static_assert(__builtin_is_cpp_trivially_relocatable(NonAddressDiscriminatedPolymorphic)); struct PolymorphicMembers { Polymorphic field; }; static_assert(!__builtin_is_cpp_trivially_relocatable(PolymorphicMembers)); struct UnionOfPolymorphic { union trivially_relocatable_if_eligible { Polymorphic p; int i; } u; }; static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfPolymorphic)); struct UnionOfNonAddressDiscriminatedPolymorphic { union trivially_relocatable_if_eligible { NonAddressDiscriminatedPolymorphic p; int i; } u; }; static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfNonAddressDiscriminatedPolymorphic)); struct UnionOfNonAddressDiscriminatedPtrauth { union { NonAddressDiscPtrauth p; int i; } u; }; static_assert(__builtin_is_cpp_trivially_relocatable(UnionOfNonAddressDiscriminatedPtrauth)); struct UnionOfAddressDisriminatedPtrauth { union { AddressDiscPtrauth p; int i; } u; }; static_assert(!__builtin_is_cpp_trivially_relocatable(UnionOfAddressDisriminatedPtrauth));