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+
24
35void __attribute__ ((trivial_abi)) foo(); // expected-warning {{'trivial_abi' attribute only applies to classes}}
46
@@ -10,30 +12,38 @@ class __attribute__((trivial_abi)) a { a(a &&); };
1012// (And it is only trivially relocatable, currently, if it is trivial for calls.)
1113// In this case, it is suppressed by an explicitly defined move constructor.
1214// Similar concerns apply to later tests that have #if defined(_WIN64) && !defined(__MINGW32__)
13- static_assert (!__is_trivially_relocatable(a<int >), " " );
15+ static_assert (!__is_trivially_relocatable(a<int >), " " ); // expected-warning{{deprecated}}
16+ static_assert (!__builtin_is_cpp_trivially_relocatable(a<int >), " " );
1417#else
15- static_assert (__is_trivially_relocatable(a<int >), " " );
18+ static_assert (__is_trivially_relocatable(a<int >), " " ); // expected-warning{{deprecated}}
19+ static_assert (!__builtin_is_cpp_trivially_relocatable(a<int >), " " );
1620#endif
1721
1822struct [[clang::trivial_abi]] S0 {
1923 int a;
2024};
21- static_assert (__is_trivially_relocatable(S0), " " );
25+ static_assert (__is_trivially_relocatable(S0), " " ); // expected-warning{{deprecated}}
26+ static_assert (__builtin_is_cpp_trivially_relocatable(S0), " " );
2227
2328struct __attribute__ ((trivial_abi)) S1 {
2429 int a;
2530};
26- static_assert (__is_trivially_relocatable(S1), " " );
31+ static_assert (__is_trivially_relocatable(S1), " " ); // expected-warning{{deprecated}}
32+ static_assert (__builtin_is_cpp_trivially_relocatable(S1), " " );
33+
2734
2835struct __attribute__ ((trivial_abi)) S3 { // expected-warning {{'trivial_abi' cannot be applied to 'S3'}} expected-note {{is polymorphic}}
2936 virtual void m ();
3037};
31- static_assert (!__is_trivially_relocatable(S3), " " );
38+ static_assert (!__is_trivially_relocatable(S3), " " ); // expected-warning{{deprecated}}
39+ static_assert (__builtin_is_cpp_trivially_relocatable(S3), " " );
40+
3241
3342struct S3_2 {
3443 virtual void m ();
3544} __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), " " );
45+ static_assert (!__is_trivially_relocatable(S3_2), " " ); // expected-warning{{deprecated}}
46+ static_assert (__builtin_is_cpp_trivially_relocatable(S3_2), " " );
3747
3848struct __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}}
3949 S3_3 (S3_3 &&);
@@ -43,9 +53,13 @@ struct __attribute__((trivial_abi)) S3_3 { // expected-warning {{'trivial_abi' c
4353// The ClangABI4OrPS4 calling convention kind passes classes in registers if the
4454// copy constructor is trivial for calls *or deleted*, while other platforms do
4555// not accept deleted constructors.
46- static_assert (__is_trivially_relocatable(S3_3), " " );
56+ static_assert (__is_trivially_relocatable(S3_3), " " ); // expected-warning{{deprecated}}
57+ static_assert (__builtin_is_cpp_trivially_relocatable(S3_3), " " );
58+
4759#else
48- static_assert (!__is_trivially_relocatable(S3_3), " " );
60+ static_assert (!__is_trivially_relocatable(S3_3), " " ); // expected-warning{{deprecated}}
61+ static_assert (!__builtin_is_cpp_trivially_relocatable(S3_3), " " );
62+
4963#endif
5064
5165// Diagnose invalid trivial_abi even when the type is templated because it has a non-trivial field.
@@ -54,20 +68,28 @@ struct __attribute__((trivial_abi)) S3_4 { // expected-warning {{'trivial_abi' c
5468 S3_4 (S3_4 &&);
5569 S3_2 s32;
5670};
57- static_assert (!__is_trivially_relocatable(S3_4<int >), " " );
71+ static_assert (!__is_trivially_relocatable(S3_4<int >), " " ); // expected-warning{{deprecated}}
72+ static_assert (!__builtin_is_cpp_trivially_relocatable(S3_4<int >), " " );
73+
5874
5975struct S4 {
6076 int a;
6177};
62- static_assert (__is_trivially_relocatable(S4), " " );
78+ static_assert (__is_trivially_relocatable(S4), " " ); // expected-warning{{deprecated}}
79+ static_assert (__builtin_is_cpp_trivially_relocatable(S4), " " );
80+
6381
6482struct __attribute__ ((trivial_abi)) S5 : public virtual S4 { // expected-warning {{'trivial_abi' cannot be applied to 'S5'}} expected-note {{has a virtual base}}
6583};
66- static_assert (!__is_trivially_relocatable(S5), " " );
84+ static_assert (!__is_trivially_relocatable(S5), " " ); // expected-warning{{deprecated}}
85+ static_assert (!__builtin_is_cpp_trivially_relocatable(S5), " " );
86+
6787
6888struct __attribute__ ((trivial_abi)) S9 : public S4 {
6989};
70- static_assert (__is_trivially_relocatable(S9), " " );
90+ static_assert (__is_trivially_relocatable(S9), " " ); // expected-warning{{deprecated}}
91+ static_assert (__builtin_is_cpp_trivially_relocatable(S9), " " );
92+
7193
7294struct __attribute__ ((trivial_abi(1 ))) S8 { // expected-error {{'trivial_abi' attribute takes no arguments}}
7395 int a;
@@ -80,8 +102,12 @@ struct __attribute__((trivial_abi)) S10 {
80102};
81103
82104S10<int *> p1;
83- static_assert (__is_trivially_relocatable(S10<int >), " " );
84- static_assert (__is_trivially_relocatable(S10<S3>), " " );
105+ static_assert (__is_trivially_relocatable(S10<int >), " " ); // expected-warning{{deprecated}}
106+ static_assert (__builtin_is_cpp_trivially_relocatable(S10<int >), " " );
107+
108+ static_assert (__is_trivially_relocatable(S10<S3>), " " ); // expected-warning{{deprecated}}
109+ static_assert (__builtin_is_cpp_trivially_relocatable(S10<S3>), " " );
110+
85111
86112template <class T >
87113struct S14 {
@@ -93,15 +119,21 @@ struct __attribute__((trivial_abi)) S15 : S14<T> {
93119};
94120
95121S15<int > s15;
96- static_assert (__is_trivially_relocatable(S15<int >), " " );
97- static_assert (__is_trivially_relocatable(S15<S3>), " " );
122+ static_assert (__is_trivially_relocatable(S15<int >), " " ); // expected-warning{{deprecated}}
123+ static_assert (__builtin_is_cpp_trivially_relocatable(S15<int >), " " );
124+
125+ static_assert (__is_trivially_relocatable(S15<S3>), " " ); // expected-warning{{deprecated}}
126+ static_assert (__builtin_is_cpp_trivially_relocatable(S15<S3>), " " );
98127
99128template <class T >
100129struct __attribute__ ((trivial_abi)) S16 {
101130 S14<T> a;
102131};
103- static_assert (__is_trivially_relocatable(S16<int >), " " );
104- static_assert (__is_trivially_relocatable(S16<S3>), " " );
132+ static_assert (__is_trivially_relocatable(S16<int >), " " ); // expected-warning{{deprecated}}
133+ static_assert (__builtin_is_cpp_trivially_relocatable(S16<int >), " " );
134+
135+ static_assert (__is_trivially_relocatable(S16<S3>), " " ); // expected-warning{{deprecated}}
136+ static_assert (__builtin_is_cpp_trivially_relocatable(S16<S3>), " " );
105137
106138S16<int > s16;
107139
@@ -110,62 +142,80 @@ struct __attribute__((trivial_abi)) S17 {
110142};
111143
112144S17<int > s17;
113- static_assert (__is_trivially_relocatable(S17<int >), " " );
114- static_assert (__is_trivially_relocatable(S17<S3>), " " );
145+ static_assert (__is_trivially_relocatable(S17<int >), " " ); // expected-warning{{deprecated}}
146+ static_assert (__builtin_is_cpp_trivially_relocatable(S17<int >), " " );
147+
148+ static_assert (__is_trivially_relocatable(S17<S3>), " " ); // expected-warning{{deprecated}}
149+ static_assert (__builtin_is_cpp_trivially_relocatable(S17<S3>), " " );
150+
115151
116152namespace deletedCopyMoveConstructor {
117153struct __attribute__ ((trivial_abi)) CopyMoveDeleted { // expected-warning {{'trivial_abi' cannot be applied to 'CopyMoveDeleted'}} expected-note {{copy constructors and move constructors are all deleted}}
118154 CopyMoveDeleted (const CopyMoveDeleted &) = delete ;
119155 CopyMoveDeleted (CopyMoveDeleted &&) = delete ;
120156};
121157#ifdef __ORBIS__
122- static_assert (__is_trivially_relocatable(CopyMoveDeleted), " " );
158+ static_assert (__is_trivially_relocatable(CopyMoveDeleted), " " ); // expected-warning{{deprecated}}
159+ static_assert (__builtin_is_cpp_trivially_relocatable(CopyMoveDeleted), " " );
160+
123161#else
124- static_assert (!__is_trivially_relocatable(CopyMoveDeleted), " " );
162+ static_assert (!__is_trivially_relocatable(CopyMoveDeleted), " " ); // expected-warning{{deprecated}}
163+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyMoveDeleted), " " );
164+
125165#endif
126166
127167struct __attribute__ ((trivial_abi)) S18 { // expected-warning {{'trivial_abi' cannot be applied to 'S18'}} expected-note {{copy constructors and move constructors are all deleted}}
128168 CopyMoveDeleted a;
129169};
130170#ifdef __ORBIS__
131- static_assert (__is_trivially_relocatable(S18), " " );
171+ static_assert (__is_trivially_relocatable(S18), " " ); // expected-warning{{deprecated}}
172+ static_assert (__builtin_is_cpp_trivially_relocatable(S18), " " );
132173#else
133- static_assert (!__is_trivially_relocatable(S18), " " );
174+ static_assert (!__is_trivially_relocatable(S18), " " ); // expected-warning{{deprecated}}
175+ static_assert (!__builtin_is_cpp_trivially_relocatable(S18), " " );
134176#endif
135177
136178struct __attribute__ ((trivial_abi)) CopyDeleted {
137179 CopyDeleted (const CopyDeleted &) = delete ;
138180 CopyDeleted (CopyDeleted &&) = default ;
139181};
140182#if defined(_WIN64) && !defined(__MINGW32__)
141- static_assert (!__is_trivially_relocatable(CopyDeleted), " " );
183+ static_assert (!__is_trivially_relocatable(CopyDeleted), " " ); // expected-warning{{deprecated}}
184+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyDeleted), " " );
185+
142186#else
143- static_assert (__is_trivially_relocatable(CopyDeleted), " " );
187+ static_assert (__is_trivially_relocatable(CopyDeleted), " " ); // expected-warning{{deprecated}}
188+ static_assert (!__builtin_is_cpp_trivially_relocatable(CopyDeleted), " " );
144189#endif
145190
146191struct __attribute__ ((trivial_abi)) MoveDeleted {
147192 MoveDeleted (const MoveDeleted &) = default ;
148193 MoveDeleted (MoveDeleted &&) = delete ;
149194};
150- static_assert (__is_trivially_relocatable(MoveDeleted), " " );
151-
195+ static_assert (__is_trivially_relocatable(MoveDeleted), " " ); // expected-warning{{deprecated}}
196+ static_assert (!__builtin_is_cpp_trivially_relocatable(MoveDeleted), " " );
152197struct __attribute__ ((trivial_abi)) S19 { // expected-warning {{'trivial_abi' cannot be applied to 'S19'}} expected-note {{copy constructors and move constructors are all deleted}}
153198 CopyDeleted a;
154199 MoveDeleted b;
155200};
156201#ifdef __ORBIS__
157- static_assert (__is_trivially_relocatable(S19), " " );
158- #else
159- static_assert (!__is_trivially_relocatable(S19), " " );
202+ static_assert (__is_trivially_relocatable(S19), " " ); // expected-warning{{deprecated}}
203+ static_assert (__builtin_is_cpp_trivially_relocatable(S19), " " );
204+ static_assert (!__is_trivially_relocatable(S19), " " ); // expected-warning{{deprecated}}
205+ static_assert (!__builtin_is_cpp_trivially_relocatable(S19), " " );
160206#endif
161207
162208// This is fine since the move constructor isn't deleted.
163209struct __attribute__ ((trivial_abi)) S20 {
164210 int &&a; // a member of rvalue reference type deletes the copy constructor.
165211};
166212#if defined(_WIN64) && !defined(__MINGW32__)
167- static_assert (!__is_trivially_relocatable(S20), " " );
213+ static_assert (!__is_trivially_relocatable(S20), " " ); // expected-warning{{deprecated}}
214+ static_assert (!__builtin_is_cpp_trivially_relocatable(S20), " " );
215+
168216#else
169- static_assert (__is_trivially_relocatable(S20), " " );
217+ static_assert (__is_trivially_relocatable(S20), " " ); // expected-warning{{deprecated}}
218+ static_assert (!__builtin_is_cpp_trivially_relocatable(S20), " " );
219+
170220#endif
171221} // namespace deletedCopyMoveConstructor
0 commit comments