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
3
3
4
4
#define AQ __ptrauth (1 ,1 ,50 )
5
5
#define IQ __ptrauth (1 ,0 ,50 )
@@ -99,7 +99,6 @@ static_assert(!__is_trivially_assignable(S4, const S4&));
99
99
static_assert (__is_trivially_destructible(S4));
100
100
static_assert (!__is_trivially_copyable(S4));
101
101
static_assert (!__is_trivially_relocatable(S4)); // expected-warning{{deprecated}}
102
- // FIXME
103
102
static_assert (__builtin_is_cpp_trivially_relocatable(S4));
104
103
static_assert (!__is_trivially_equality_comparable(S4));
105
104
@@ -124,7 +123,6 @@ static_assert(!__is_trivially_assignable(S5, const S5&));
124
123
static_assert (__is_trivially_destructible(S5));
125
124
static_assert (!__is_trivially_copyable(S5));
126
125
static_assert (!__is_trivially_relocatable(S5)); // expected-warning{{deprecated}}
127
- // FIXME
128
126
static_assert (__builtin_is_cpp_trivially_relocatable(S5));
129
127
static_assert (!__is_trivially_equality_comparable(S5));
130
128
@@ -182,3 +180,39 @@ static_assert(__is_trivially_copyable(Holder<S7>));
182
180
static_assert (__is_trivially_relocatable(Holder<S7>)); // expected-warning{{deprecated}}
183
181
static_assert (__builtin_is_cpp_trivially_relocatable(Holder<S7>));
184
182
static_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