11// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
2+ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-windows-msvc -std=c++11
3+ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-scei-ps4 -std=c++11
4+
25
36void __attribute__ ((trivial_abi)) foo(); // expected-warning {{'trivial_abi' attribute only applies to classes}}
47
@@ -10,30 +13,38 @@ class __attribute__((trivial_abi)) a { a(a &&); };
1013// (And it is only trivially relocatable, currently, if it is trivial for calls.)
1114// In this case, it is suppressed by an explicitly defined move constructor.
1215// Similar concerns apply to later tests that have #if defined(_WIN64) && !defined(__MINGW32__)
13- static_assert (!__is_trivially_relocatable(a<int >), " " );
16+ static_assert (!__is_trivially_relocatable(a<int >), " " ); // expected-warning{{deprecated}}
17+ static_assert (!__builtin_is_cpp_trivially_relocatable(a<int >), " " );
1418#else
15- static_assert (__is_trivially_relocatable(a<int >), " " );
19+ static_assert (__is_trivially_relocatable(a<int >), " " ); // expected-warning{{deprecated}}
20+ static_assert (!__builtin_is_cpp_trivially_relocatable(a<int >), " " );
1621#endif
1722
1823struct [[clang::trivial_abi]] S0 {
1924 int a;
2025};
21- static_assert (__is_trivially_relocatable(S0), " " );
26+ static_assert (__is_trivially_relocatable(S0), " " ); // expected-warning{{deprecated}}
27+ static_assert (__builtin_is_cpp_trivially_relocatable(S0), " " );
2228
2329struct __attribute__ ((trivial_abi)) S1 {
2430 int a;
2531};
26- static_assert (__is_trivially_relocatable(S1), " " );
32+ static_assert (__is_trivially_relocatable(S1), " " ); // expected-warning{{deprecated}}
33+ static_assert (__builtin_is_cpp_trivially_relocatable(S1), " " );
34+
2735
2836struct __attribute__ ((trivial_abi)) S3 { // expected-warning {{'trivial_abi' cannot be applied to 'S3'}} expected-note {{is polymorphic}}
2937 virtual void m ();
3038};
31- static_assert (!__is_trivially_relocatable(S3), " " );
39+ static_assert (!__is_trivially_relocatable(S3), " " ); // expected-warning{{deprecated}}
40+ static_assert (__builtin_is_cpp_trivially_relocatable(S3), " " );
41+
3242
3343struct S3_2 {
3444 virtual void m ();
3545} __attribute__((trivial_abi)); // expected-warning {{'trivial_abi' cannot be applied to 'S3_2'}} expected-note {{is polymorphic}}
36- static_assert (!__is_trivially_relocatable(S3_2), " " );
46+ static_assert (!__is_trivially_relocatable(S3_2), " " ); // expected-warning{{deprecated}}
47+ static_assert (__builtin_is_cpp_trivially_relocatable(S3_2), " " );
3748
3849struct __attribute__ ((trivial_abi)) S3_3 { // expected-warning {{'trivial_abi' cannot be applied to 'S3_3'}} expected-note {{has a field of a non-trivial class type}}
3950 S3_3 (S3_3 &&);
@@ -43,9 +54,13 @@ struct __attribute__((trivial_abi)) S3_3 { // expected-warning {{'trivial_abi' c
4354// The ClangABI4OrPS4 calling convention kind passes classes in registers if the
4455// copy constructor is trivial for calls *or deleted*, while other platforms do
4556// not accept deleted constructors.
46- static_assert (__is_trivially_relocatable(S3_3), " " );
57+ static_assert (__is_trivially_relocatable(S3_3), " " ); // expected-warning{{deprecated}}
58+ static_assert (!__builtin_is_cpp_trivially_relocatable(S3_3), " " );
59+
4760#else
48- static_assert (!__is_trivially_relocatable(S3_3), " " );
61+ static_assert (!__is_trivially_relocatable(S3_3), " " ); // expected-warning{{deprecated}}
62+ static_assert (!__builtin_is_cpp_trivially_relocatable(S3_3), " " );
63+
4964#endif
5065
5166// Diagnose invalid trivial_abi even when the type is templated because it has a non-trivial field.
@@ -54,20 +69,28 @@ struct __attribute__((trivial_abi)) S3_4 { // expected-warning {{'trivial_abi' c
5469 S3_4 (S3_4 &&);
5570 S3_2 s32;
5671};
57- static_assert (!__is_trivially_relocatable(S3_4<int >), " " );
72+ static_assert (!__is_trivially_relocatable(S3_4<int >), " " ); // expected-warning{{deprecated}}
73+ static_assert (!__builtin_is_cpp_trivially_relocatable(S3_4<int >), " " );
74+
5875
5976struct S4 {
6077 int a;
6178};
62- static_assert (__is_trivially_relocatable(S4), " " );
79+ static_assert (__is_trivially_relocatable(S4), " " ); // expected-warning{{deprecated}}
80+ static_assert (__builtin_is_cpp_trivially_relocatable(S4), " " );
81+
6382
6483struct __attribute__ ((trivial_abi)) S5 : public virtual S4 { // expected-warning {{'trivial_abi' cannot be applied to 'S5'}} expected-note {{has a virtual base}}
6584};
66- static_assert (!__is_trivially_relocatable(S5), " " );
85+ static_assert (!__is_trivially_relocatable(S5), " " ); // expected-warning{{deprecated}}
86+ static_assert (!__builtin_is_cpp_trivially_relocatable(S5), " " );
87+
6788
6889struct __attribute__ ((trivial_abi)) S9 : public S4 {
6990};
70- static_assert (__is_trivially_relocatable(S9), " " );
91+ static_assert (__is_trivially_relocatable(S9), " " ); // expected-warning{{deprecated}}
92+ static_assert (__builtin_is_cpp_trivially_relocatable(S9), " " );
93+
7194
7295struct __attribute__ ((trivial_abi(1 ))) S8 { // expected-error {{'trivial_abi' attribute takes no arguments}}
7396 int a;
@@ -80,8 +103,12 @@ struct __attribute__((trivial_abi)) S10 {
80103};
81104
82105S10<int *> p1;
83- static_assert (__is_trivially_relocatable(S10<int >), " " );
84- static_assert (__is_trivially_relocatable(S10<S3>), " " );
106+ static_assert (__is_trivially_relocatable(S10<int >), " " ); // expected-warning{{deprecated}}
107+ static_assert (__builtin_is_cpp_trivially_relocatable(S10<int >), " " );
108+
109+ static_assert (__is_trivially_relocatable(S10<S3>), " " ); // expected-warning{{deprecated}}
110+ static_assert (__builtin_is_cpp_trivially_relocatable(S10<S3>), " " );
111+
85112
86113template <class T >
87114struct S14 {
@@ -93,15 +120,21 @@ struct __attribute__((trivial_abi)) S15 : S14<T> {
93120};
94121
95122S15<int > s15;
96- static_assert (__is_trivially_relocatable(S15<int >), " " );
97- static_assert (__is_trivially_relocatable(S15<S3>), " " );
123+ static_assert (__is_trivially_relocatable(S15<int >), " " ); // expected-warning{{deprecated}}
124+ static_assert (__builtin_is_cpp_trivially_relocatable(S15<int >), " " );
125+
126+ static_assert (__is_trivially_relocatable(S15<S3>), " " ); // expected-warning{{deprecated}}
127+ static_assert (__builtin_is_cpp_trivially_relocatable(S15<S3>), " " );
98128
99129template <class T >
100130struct __attribute__ ((trivial_abi)) S16 {
101131 S14<T> a;
102132};
103- static_assert (__is_trivially_relocatable(S16<int >), " " );
104- static_assert (__is_trivially_relocatable(S16<S3>), " " );
133+ static_assert (__is_trivially_relocatable(S16<int >), " " ); // expected-warning{{deprecated}}
134+ static_assert (__builtin_is_cpp_trivially_relocatable(S16<int >), " " );
135+
136+ static_assert (__is_trivially_relocatable(S16<S3>), " " ); // expected-warning{{deprecated}}
137+ static_assert (__builtin_is_cpp_trivially_relocatable(S16<S3>), " " );
105138
106139S16<int > s16;
107140
@@ -110,62 +143,81 @@ struct __attribute__((trivial_abi)) S17 {
110143};
111144
112145S17<int > s17;
113- static_assert (__is_trivially_relocatable(S17<int >), " " );
114- static_assert (__is_trivially_relocatable(S17<S3>), " " );
146+ static_assert (__is_trivially_relocatable(S17<int >), " " ); // expected-warning{{deprecated}}
147+ static_assert (__builtin_is_cpp_trivially_relocatable(S17<int >), " " );
148+
149+ static_assert (__is_trivially_relocatable(S17<S3>), " " ); // expected-warning{{deprecated}}
150+ static_assert (__builtin_is_cpp_trivially_relocatable(S17<S3>), " " );
151+
115152
116153namespace deletedCopyMoveConstructor {
117154struct __attribute__ ((trivial_abi)) CopyMoveDeleted { // expected-warning {{'trivial_abi' cannot be applied to 'CopyMoveDeleted'}} expected-note {{copy constructors and move constructors are all deleted}}
118155 CopyMoveDeleted (const CopyMoveDeleted &) = delete ;
119156 CopyMoveDeleted (CopyMoveDeleted &&) = delete ;
120157};
121158#ifdef __ORBIS__
122- static_assert (__is_trivially_relocatable(CopyMoveDeleted), " " );
159+ static_assert (__is_trivially_relocatable(CopyMoveDeleted), " " ); // expected-warning{{deprecated}}
160+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyMoveDeleted), " " );
161+
123162#else
124- static_assert (!__is_trivially_relocatable(CopyMoveDeleted), " " );
163+ static_assert (!__is_trivially_relocatable(CopyMoveDeleted), " " ); // expected-warning{{deprecated}}
164+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyMoveDeleted), " " );
165+
125166#endif
126167
127168struct __attribute__ ((trivial_abi)) S18 { // expected-warning {{'trivial_abi' cannot be applied to 'S18'}} expected-note {{copy constructors and move constructors are all deleted}}
128169 CopyMoveDeleted a;
129170};
130171#ifdef __ORBIS__
131- static_assert (__is_trivially_relocatable(S18), " " );
172+ static_assert (__is_trivially_relocatable(S18), " " ); // expected-warning{{deprecated}}
173+ static_assert (!__builtin_is_cpp_trivially_relocatable(S18), " " );
132174#else
133- static_assert (!__is_trivially_relocatable(S18), " " );
175+ static_assert (!__is_trivially_relocatable(S18), " " ); // expected-warning{{deprecated}}
176+ static_assert (!__builtin_is_cpp_trivially_relocatable(S18), " " );
134177#endif
135178
136179struct __attribute__ ((trivial_abi)) CopyDeleted {
137180 CopyDeleted (const CopyDeleted &) = delete ;
138181 CopyDeleted (CopyDeleted &&) = default ;
139182};
140183#if defined(_WIN64) && !defined(__MINGW32__)
141- static_assert (!__is_trivially_relocatable(CopyDeleted), " " );
184+ static_assert (!__is_trivially_relocatable(CopyDeleted), " " ); // expected-warning{{deprecated}}
185+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyDeleted), " " );
186+
142187#else
143- static_assert (__is_trivially_relocatable(CopyDeleted), " " );
188+ static_assert (__is_trivially_relocatable(CopyDeleted), " " ); // expected-warning{{deprecated}}
189+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyDeleted), " " );
144190#endif
145191
146192struct __attribute__ ((trivial_abi)) MoveDeleted {
147193 MoveDeleted (const MoveDeleted &) = default ;
148194 MoveDeleted (MoveDeleted &&) = delete ;
149195};
150- static_assert (__is_trivially_relocatable(MoveDeleted), " " );
151-
196+ static_assert (__is_trivially_relocatable(MoveDeleted), " " ); // expected-warning{{deprecated}}
197+ static_assert (!__builtin_is_cpp_trivially_relocatable(MoveDeleted), " " );
152198struct __attribute__ ((trivial_abi)) S19 { // expected-warning {{'trivial_abi' cannot be applied to 'S19'}} expected-note {{copy constructors and move constructors are all deleted}}
153199 CopyDeleted a;
154200 MoveDeleted b;
155201};
156202#ifdef __ORBIS__
157- static_assert (__is_trivially_relocatable(S19), " " );
203+ static_assert (__is_trivially_relocatable(S19), " " ); // expected-warning{{deprecated}}
204+ static_assert (!__builtin_is_cpp_trivially_relocatable(S19), " " );
158205#else
159- static_assert (!__is_trivially_relocatable(S19), " " );
206+ static_assert (!__is_trivially_relocatable(S19), " " ); // expected-warning{{deprecated}}
207+ static_assert (!__builtin_is_cpp_trivially_relocatable(S19), " " );
160208#endif
161209
162210// This is fine since the move constructor isn't deleted.
163211struct __attribute__ ((trivial_abi)) S20 {
164212 int &&a; // a member of rvalue reference type deletes the copy constructor.
165213};
166214#if defined(_WIN64) && !defined(__MINGW32__)
167- static_assert (!__is_trivially_relocatable(S20), " " );
215+ static_assert (!__is_trivially_relocatable(S20), " " ); // expected-warning{{deprecated}}
216+ static_assert (!__builtin_is_cpp_trivially_relocatable(S20), " " );
217+
168218#else
169- static_assert (__is_trivially_relocatable(S20), " " );
219+ static_assert (__is_trivially_relocatable(S20), " " ); // expected-warning{{deprecated}}
220+ static_assert (!__builtin_is_cpp_trivially_relocatable(S20), " " );
221+
170222#endif
171223} // namespace deletedCopyMoveConstructor
0 commit comments