1- // RUN: %clang_cc1 -triple arm64-apple-ios -std=c++20 -fptrauth-calls -fptrauth-intrinsics -verify -fsyntax-only %s
2- // RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c++20 -fptrauth-calls -fptrauth-intrinsics -verify -fsyntax-only %s
1+ // RUN: %clang_cc1 -triple arm64-apple-ios -std=c++26 -fptrauth-calls -fptrauth-intrinsics -verify -fsyntax-only %s
2+ // RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c++26 -fptrauth-calls -fptrauth-intrinsics -verify -fsyntax-only %s
33
44#define AQ __ptrauth (1 ,1 ,50 )
55#define IQ __ptrauth (1 ,0 ,50 )
@@ -99,7 +99,6 @@ static_assert(!__is_trivially_assignable(S4, const S4&));
9999static_assert (__is_trivially_destructible(S4));
100100static_assert (!__is_trivially_copyable(S4));
101101static_assert (!__is_trivially_relocatable(S4)); // expected-warning{{deprecated}}
102- // FIXME
103102static_assert (__builtin_is_cpp_trivially_relocatable(S4));
104103static_assert (!__is_trivially_equality_comparable(S4));
105104
@@ -124,7 +123,6 @@ static_assert(!__is_trivially_assignable(S5, const S5&));
124123static_assert (__is_trivially_destructible(S5));
125124static_assert (!__is_trivially_copyable(S5));
126125static_assert (!__is_trivially_relocatable(S5)); // expected-warning{{deprecated}}
127- // FIXME
128126static_assert (__builtin_is_cpp_trivially_relocatable(S5));
129127static_assert (!__is_trivially_equality_comparable(S5));
130128
@@ -182,3 +180,39 @@ static_assert(__is_trivially_copyable(Holder<S7>));
182180static_assert (__is_trivially_relocatable(Holder<S7>)); // expected-warning{{deprecated}}
183181static_assert (__builtin_is_cpp_trivially_relocatable(Holder<S7>));
184182static_assert (__is_trivially_equality_comparable(Holder<S7>));
183+
184+ template <class ... Bases> struct MultipleInheriter : Bases... {
185+ };
186+
187+ template <class T > static const bool test_is_trivially_relocatable_v = __builtin_is_cpp_trivially_relocatable(T);
188+ template <class ... Types> static const bool multiple_inheritance_is_relocatable = test_is_trivially_relocatable_v<MultipleInheriter<Types...>>;
189+ template <class ... Types> static const bool inheritance_relocatability_matches_bases_v =
190+ (test_is_trivially_relocatable_v<Types> && ...) == multiple_inheritance_is_relocatable<Types...>;
191+
192+ static_assert (multiple_inheritance_is_relocatable<S4, S5> == multiple_inheritance_is_relocatable<S5, S4>);
193+ static_assert (inheritance_relocatability_matches_bases_v<S4, S5>);
194+ static_assert (inheritance_relocatability_matches_bases_v<S5, S4>);
195+
196+ struct AA AddressDiscriminatedPolymorphicBase trivially_relocatable_if_eligible {
197+ virtual void foo ();
198+ };
199+
200+ struct IA NoAddressDiscriminatedPolymorphicBase trivially_relocatable_if_eligible {
201+ virtual void bar ();
202+ };
203+
204+ template <class T > struct UnionWrapper trivially_relocatable_if_eligible {
205+ union U {
206+ T field1;
207+ } u;
208+ };
209+
210+ static_assert (test_is_trivially_relocatable_v<AddressDiscriminatedPolymorphicBase>);
211+ static_assert (test_is_trivially_relocatable_v<NoAddressDiscriminatedPolymorphicBase>);
212+ static_assert (inheritance_relocatability_matches_bases_v<AddressDiscriminatedPolymorphicBase, NoAddressDiscriminatedPolymorphicBase>);
213+ static_assert (inheritance_relocatability_matches_bases_v<NoAddressDiscriminatedPolymorphicBase, AddressDiscriminatedPolymorphicBase>);
214+
215+ static_assert (!test_is_trivially_relocatable_v<UnionWrapper<AddressDiscriminatedPolymorphicBase>>);
216+ static_assert (test_is_trivially_relocatable_v<UnionWrapper<NoAddressDiscriminatedPolymorphicBase>>);
217+ static_assert (!test_is_trivially_relocatable_v<UnionWrapper<MultipleInheriter<NoAddressDiscriminatedPolymorphicBase, AddressDiscriminatedPolymorphicBase>>>);
218+ static_assert (!test_is_trivially_relocatable_v<UnionWrapper<MultipleInheriter<AddressDiscriminatedPolymorphicBase, NoAddressDiscriminatedPolymorphicBase>>>);
0 commit comments