// RUN: %clang_cc1 -triple arm64-apple-ios -std=c++26 -fptrauth-calls -fptrauth-intrinsics -verify -fsyntax-only %s // RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c++26 -fptrauth-calls -fptrauth-intrinsics -verify -fsyntax-only %s #define AQ __ptrauth(1,1,50) #define IQ __ptrauth(1,0,50) #define AQ_IP __ptrauth(1,1,50) #define IQ_IP __ptrauth(1,0,50) #define AA [[clang::ptrauth_vtable_pointer(process_independent,address_discrimination,no_extra_discrimination)]] #define IA [[clang::ptrauth_vtable_pointer(process_independent,no_address_discrimination,type_discrimination)]] #define PA [[clang::ptrauth_vtable_pointer(process_dependent,no_address_discrimination,no_extra_discrimination)]] template struct Holder { T t_; bool operator==(const Holder&) const = default; }; struct S1 { int * AQ p_; void *payload_; bool operator==(const S1&) const = default; }; static_assert(__is_trivially_constructible(S1)); static_assert(!__is_trivially_constructible(S1, const S1&)); static_assert(!__is_trivially_assignable(S1, const S1&)); static_assert(__is_trivially_destructible(S1)); static_assert(!__is_trivially_copyable(S1)); static_assert(!__is_trivially_relocatable(S1)); // expected-warning{{deprecated}} static_assert(!__builtin_is_cpp_trivially_relocatable(S1)); static_assert(!__is_trivially_equality_comparable(S1)); static_assert(__is_trivially_constructible(Holder)); static_assert(!__is_trivially_constructible(Holder, const Holder&)); static_assert(!__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(!__is_trivially_copyable(Holder)); static_assert(!__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(!__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(!__is_trivially_equality_comparable(Holder)); struct S2 { int * IQ p_; void *payload_; bool operator==(const S2&) const = default; }; static_assert(__is_trivially_constructible(S2)); static_assert(__is_trivially_constructible(S2, const S2&)); static_assert(__is_trivially_assignable(S2, const S2&)); static_assert(__is_trivially_destructible(S2)); static_assert(__is_trivially_copyable(S2)); static_assert(__is_trivially_relocatable(S2)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(S2)); static_assert(__is_trivially_equality_comparable(S2)); static_assert(__is_trivially_constructible(Holder)); static_assert(__is_trivially_constructible(Holder, const Holder&)); static_assert(__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(__is_trivially_copyable(Holder)); static_assert(__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(__is_trivially_equality_comparable(Holder)); struct AA S3 { virtual void f(); void *payload_; bool operator==(const S3&) const = default; }; static_assert(!__is_trivially_constructible(S3)); static_assert(!__is_trivially_constructible(S3, const S3&)); static_assert(!__is_trivially_assignable(S3, const S3&)); static_assert(__is_trivially_destructible(S3)); static_assert(!__is_trivially_copyable(S3)); static_assert(!__is_trivially_relocatable(S3)); // expected-warning{{deprecated}} //FIXME static_assert(!__builtin_is_cpp_trivially_relocatable(S3)); static_assert(!__is_trivially_equality_comparable(S3)); static_assert(!__is_trivially_constructible(Holder)); static_assert(!__is_trivially_constructible(Holder, const Holder&)); static_assert(!__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(!__is_trivially_copyable(Holder)); static_assert(!__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(!__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(!__is_trivially_equality_comparable(Holder)); struct IA S4 { virtual void f(); void *payload_; bool operator==(const S4&) const = default; }; static_assert(!__is_trivially_constructible(S4)); static_assert(!__is_trivially_constructible(S4, const S4&)); static_assert(!__is_trivially_assignable(S4, const S4&)); static_assert(__is_trivially_destructible(S4)); static_assert(!__is_trivially_copyable(S4)); static_assert(!__is_trivially_relocatable(S4)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(S4)); static_assert(!__is_trivially_equality_comparable(S4)); static_assert(!__is_trivially_constructible(Holder)); static_assert(!__is_trivially_constructible(Holder, const Holder&)); static_assert(!__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(!__is_trivially_copyable(Holder)); static_assert(__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(!__is_trivially_equality_comparable(Holder)); struct PA S5 { virtual void f(); void *payload_; bool operator==(const S5&) const = default; }; static_assert(!__is_trivially_constructible(S5)); static_assert(!__is_trivially_constructible(S5, const S5&)); static_assert(!__is_trivially_assignable(S5, const S5&)); static_assert(__is_trivially_destructible(S5)); static_assert(!__is_trivially_copyable(S5)); static_assert(!__is_trivially_relocatable(S5)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(S5)); static_assert(!__is_trivially_equality_comparable(S5)); static_assert(!__is_trivially_constructible(Holder)); static_assert(!__is_trivially_constructible(Holder, const Holder&)); static_assert(!__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(!__is_trivially_copyable(Holder)); static_assert(__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(!__is_trivially_equality_comparable(Holder)); struct S6 { __INTPTR_TYPE__ AQ_IP p_; void *payload_; bool operator==(const S6&) const = default; }; static_assert(__is_trivially_constructible(S6)); static_assert(!__is_trivially_constructible(S6, const S6&)); static_assert(!__is_trivially_assignable(S6, const S6&)); static_assert(__is_trivially_destructible(S6)); static_assert(!__is_trivially_copyable(S6)); static_assert(!__is_trivially_relocatable(S6)); // expected-warning{{deprecated}} static_assert(!__builtin_is_cpp_trivially_relocatable(S6)); static_assert(!__is_trivially_equality_comparable(S6)); static_assert(__is_trivially_constructible(Holder)); static_assert(!__is_trivially_constructible(Holder, const Holder&)); static_assert(!__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(!__is_trivially_copyable(Holder)); static_assert(!__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(!__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(!__is_trivially_equality_comparable(Holder)); struct S7 { __INTPTR_TYPE__ IQ_IP p_; void *payload_; bool operator==(const S7&) const = default; }; static_assert(__is_trivially_constructible(S7)); static_assert(__is_trivially_constructible(S7, const S7&)); static_assert(__is_trivially_assignable(S7&, const S7&)); static_assert(__is_trivially_destructible(S7)); static_assert(__is_trivially_copyable(S7)); static_assert(__is_trivially_relocatable(S7)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(S7)); static_assert(__is_trivially_equality_comparable(S7)); static_assert(__is_trivially_constructible(Holder)); static_assert(__is_trivially_constructible(Holder, const Holder&)); static_assert(__is_trivially_assignable(Holder, const Holder&)); static_assert(__is_trivially_destructible(Holder)); static_assert(__is_trivially_copyable(Holder)); static_assert(__is_trivially_relocatable(Holder)); // expected-warning{{deprecated}} static_assert(__builtin_is_cpp_trivially_relocatable(Holder)); static_assert(__is_trivially_equality_comparable(Holder)); template struct MultipleInheriter : Bases... { }; template static const bool test_is_trivially_relocatable_v = __builtin_is_cpp_trivially_relocatable(T); template static const bool multiple_inheritance_is_relocatable = test_is_trivially_relocatable_v>; template static const bool inheritance_relocatability_matches_bases_v = (test_is_trivially_relocatable_v && ...) == multiple_inheritance_is_relocatable; static_assert(multiple_inheritance_is_relocatable == multiple_inheritance_is_relocatable); static_assert(inheritance_relocatability_matches_bases_v); static_assert(inheritance_relocatability_matches_bases_v); struct AA AddressDiscriminatedPolymorphicBase trivially_relocatable_if_eligible { virtual void foo(); }; struct IA NoAddressDiscriminatedPolymorphicBase trivially_relocatable_if_eligible { virtual void bar(); }; template struct UnionWrapper trivially_relocatable_if_eligible { union U { T field1; } u; }; static_assert(!test_is_trivially_relocatable_v); static_assert(test_is_trivially_relocatable_v); static_assert(inheritance_relocatability_matches_bases_v); static_assert(inheritance_relocatability_matches_bases_v); static_assert(!test_is_trivially_relocatable_v>); static_assert(test_is_trivially_relocatable_v>); static_assert(!test_is_trivially_relocatable_v>>); static_assert(!test_is_trivially_relocatable_v>>);