1 // RUN: %clang_cc1 -fsyntax-only -verify %s -Wimplicit-int-conversion -Wno-unused -Wunevaluated-expression -triple x86_64-gnu-linux
2
3 template<int Bounds>
4 struct HasExtInt {
5 _BitInt(Bounds) b;
6 unsigned _BitInt(Bounds) b2;
7 };
8
9 // Delcaring variables:
10 _BitInt(33) Declarations(_BitInt(48) &Param) { // Useable in params and returns.
11 short _BitInt(43) a; // expected-error {{'short _BitInt' is invalid}}
12 _BitInt(43) long b; // expected-error {{'long _BitInt' is invalid}}
13
14 // These should all be fine:
15 const _BitInt(5) c = 3;
16 const unsigned _BitInt(5) d; // expected-error {{default initialization of an object of const type 'const unsigned _BitInt(5)'}}
17 unsigned _BitInt(5) e = 5;
18 _BitInt(5) unsigned f;
19
20 _BitInt(-3) g; // expected-error{{signed _BitInt of bit sizes greater than 128 not supported}}
21 _BitInt(0) h; // expected-error{{signed _BitInt must have a bit size of at least 2}}
22 _BitInt(1) i; // expected-error{{signed _BitInt must have a bit size of at least 2}}
23 _BitInt(2) j;;
24 unsigned _BitInt(0) k;// expected-error{{unsigned _BitInt must have a bit size of at least 1}}
25 unsigned _BitInt(1) l;
26 signed _BitInt(1) m; // expected-error{{signed _BitInt must have a bit size of at least 2}}
27
28 constexpr _BitInt(6) n = 33; // expected-warning{{implicit conversion from 'int' to 'const _BitInt(6)' changes value from 33 to -31}}
29 constexpr _BitInt(7) o = 33;
30
31 // Check imposed max size.
32 _BitInt(129) p; // expected-error {{signed _BitInt of bit sizes greater than 128 not supported}}
33 unsigned _BitInt(0xFFFFFFFFFF) q; // expected-error {{unsigned _BitInt of bit sizes greater than 128 not supported}}
34
35 // Ensure template params are instantiated correctly.
36 // expected-error@5{{signed _BitInt of bit sizes greater than 128 not supported}}
37 // expected-error@6{{unsigned _BitInt of bit sizes greater than 128 not supported}}
38 // expected-note@+1{{in instantiation of template class }}
39 HasExtInt<-1> r;
40 // expected-error@5{{signed _BitInt must have a bit size of at least 2}}
41 // expected-error@6{{unsigned _BitInt must have a bit size of at least 1}}
42 // expected-note@+1{{in instantiation of template class }}
43 HasExtInt<0> s;
44 // expected-error@5{{signed _BitInt must have a bit size of at least 2}}
45 // expected-note@+1{{in instantiation of template class }}
46 HasExtInt<1> t;
47 HasExtInt<2> u;
48
49 _BitInt(-3.0) v; // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
50 _BitInt(3.0) x; // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'double'}}
51
52 return 0;
53 }
54
55 template <_BitInt(5) I>
56 struct ExtIntTemplParam {
57 static constexpr _BitInt(5) Var = I;
58 };
59
60 template<typename T>
deduced_whole_type(T)61 void deduced_whole_type(T){}
62 template<int I>
deduced_bound(_BitInt (I))63 void deduced_bound(_BitInt(I)){}
64
65 // Ensure ext-int can be used in template places.
Templates()66 void Templates() {
67 ExtIntTemplParam<13> a;
68 constexpr _BitInt(3) b = 1;
69 ExtIntTemplParam<b> c;
70 constexpr _BitInt(9) d = 1;
71 ExtIntTemplParam<b> e;
72
73 deduced_whole_type(b);
74 deduced_bound(b);
75 }
76
77 template <typename T, typename U>
78 struct is_same {
79 static constexpr bool value = false;
80 };
81 template <typename T>
82 struct is_same<T,T> {
83 static constexpr bool value = true;
84 };
85
86 // Reject vector types:
87 // expected-error@+1{{invalid vector element type '_BitInt(32)'}}
88 typedef _BitInt(32) __attribute__((vector_size(16))) VecTy;
89
90 // Allow _Complex:
91 _Complex _BitInt(3) Cmplx;
92
93 // Reject cases of _Atomic:
94 // expected-error@+1{{_Atomic cannot be applied to integer type '_BitInt(4)'}}
95 _Atomic _BitInt(4) TooSmallAtomic;
96 // expected-error@+1{{_Atomic cannot be applied to integer type '_BitInt(9)'}}
97 _Atomic _BitInt(9) NotPow2Atomic;
98 // expected-error@+1{{_Atomic cannot be applied to integer type '_BitInt(128)'}}
99 _Atomic _BitInt(128) JustRightAtomic;
100
101 // Test result types of Unary/Bitwise/Binary Operations:
Ops()102 void Ops() {
103 _BitInt(43) x43_s = 1, y43_s = 1;
104 _BitInt(sizeof(int) * 8) x32_s = 1, y32_s = 1;
105 unsigned _BitInt(sizeof(unsigned) * 8) x32_u = 1, y32_u = 1;
106 _BitInt(4) x4_s = 1, y4_s = 1;
107 unsigned _BitInt(43) x43_u = 1, y43_u = 1;
108 unsigned _BitInt(4) x4_u = 1, y4_u = 1;
109 int x_int = 1, y_int = 1;
110 unsigned x_uint = 1, y_uint = 1;
111 bool b;
112
113 // Signed/unsigned mixed.
114 x43_u + y43_s;
115 x4_s - y4_u;
116 x43_s * y43_u;
117 x4_u / y4_s;
118
119 // Different Sizes.
120 x43_s + y4_s;
121 x43_s - y4_u;
122 x43_u * y4_u;
123 x4_u / y43_u;
124
125 // Mixed with standard types.
126 x43_s + x_int;
127 x43_u - x_int;
128 x32_s * x_int;
129 x32_u / x_int;
130 x32_s * x_uint;
131 x32_u / x_uint;
132 x4_s + x_int;
133 x4_u - x_int;
134 x4_s + b;
135 x4_u - b;
136 x43_s + b;
137 x43_u - b;
138 static_assert(is_same<decltype(x43_s + x_int), _BitInt(43)>::value, "");
139 static_assert(is_same<decltype(x43_u + x_int), unsigned _BitInt(43)>::value, "");
140 static_assert(is_same<decltype(x32_s + x_int), int>::value, "");
141 static_assert(is_same<decltype(x32_u + x_int), unsigned int>::value, "");
142 static_assert(is_same<decltype(x32_s + x_uint), unsigned int>::value, "");
143 static_assert(is_same<decltype(x32_u + x_uint), unsigned int>::value, "");
144 static_assert(is_same<decltype(x4_s + x_int), int>::value, "");
145 static_assert(is_same<decltype(x4_u + x_int), int>::value, "");
146 static_assert(is_same<decltype(x4_s + x_uint), unsigned int>::value, "");
147 static_assert(is_same<decltype(x4_u + x_uint), unsigned int>::value, "");
148
149 // Bitwise checks.
150 x43_s % y4_u;
151 x43_u % y4_s;
152 x4_s | y43_u;
153 x4_u | y43_s;
154
155 // compassign.
156 x43_s += 33;
157
158 // Comparisons.
159 x43_s > 33;
160 x4_s > 33; // expected-warning {{result of comparison of constant 33 with expression of type '_BitInt(4)' is always false}}
161
162 // Same size/sign ops don't change type.
163 static_assert(is_same<decltype(x43_s + y43_s), _BitInt(43)>::value,"");
164 static_assert(is_same<decltype(x4_s - y4_s), _BitInt(4)>::value,"");
165 static_assert(is_same<decltype(x43_u * y43_u), unsigned _BitInt(43)>::value,"");
166 static_assert(is_same<decltype(x4_u / y4_u), unsigned _BitInt(4)>::value,"");
167
168 // Unary ops shouldn't go through integer promotions.
169 static_assert(is_same<decltype(~x43_s), _BitInt(43)>::value,"");
170 static_assert(is_same<decltype(~x4_s), _BitInt(4)>::value,"");
171 static_assert(is_same<decltype(+x43_s), _BitInt(43)>::value,"");
172 static_assert(is_same<decltype(+x4_s), _BitInt(4)>::value,"");
173 static_assert(is_same<decltype(-x43_u), unsigned _BitInt(43)>::value,"");
174 static_assert(is_same<decltype(-x4_u), unsigned _BitInt(4)>::value,"");
175 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
176 static_assert(is_same<decltype(++x43_s), _BitInt(43)&>::value,"");
177 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
178 static_assert(is_same<decltype(--x4_s), _BitInt(4)&>::value,"");
179 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
180 static_assert(is_same<decltype(x43_s--), _BitInt(43)>::value,"");
181 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
182 static_assert(is_same<decltype(x4_s++), _BitInt(4)>::value,"");
183 static_assert(is_same<decltype(x4_s >> 1), _BitInt(4)>::value,"");
184 static_assert(is_same<decltype(x4_u << 1), unsigned _BitInt(4)>::value,"");
185
186 static_assert(sizeof(x43_s) == 8, "");
187 static_assert(sizeof(x4_s) == 1, "");
188
189 static_assert(alignof(decltype(x43_s)) == 8, "");
190 static_assert(alignof(decltype(x4_s)) == 1, "");
191 }
192
func()193 constexpr int func() { return 42;}
194
ConstexprBitsize()195 void ConstexprBitsize() {
196 _BitInt(func()) F;
197 static_assert(is_same<decltype(F), _BitInt(42)>::value, "");
198 }
199
200 // Useable as an underlying type.
201 enum AsEnumUnderlyingType : _BitInt(33) {
202 };
203
204 void overloaded(int);
205 void overloaded(_BitInt(32));
206 void overloaded(_BitInt(33));
207 void overloaded(short);
208 //expected-note@+1{{candidate function}}
209 void overloaded2(_BitInt(32));
210 //expected-note@+1{{candidate function}}
211 void overloaded2(_BitInt(33));
212 //expected-note@+1{{candidate function}}
213 void overloaded2(short);
214
overload_use()215 void overload_use() {
216 int i;
217 _BitInt(32) i32;
218 _BitInt(33) i33;
219 short s;
220
221 // All of these get their corresponding exact matches.
222 overloaded(i);
223 overloaded(i32);
224 overloaded(i33);
225 overloaded(s);
226
227 overloaded2(i); // expected-error{{call to 'overloaded2' is ambiguous}}
228
229 overloaded2(i32);
230
231 overloaded2(s);
232 }
233
234 // no errors expected, this should 'just work'.
235 struct UsedAsBitField {
236 _BitInt(3) F : 3;
237 _BitInt(3) G : 3;
238 _BitInt(3) H : 3;
239 };
240
241 struct CursedBitField {
242 _BitInt(4) A : 8; // expected-warning {{width of bit-field 'A' (8 bits) exceeds the width of its type; value will be truncated to 4 bits}}
243 };
244
245 // expected-error@+1{{mode attribute only supported for integer and floating-point types}}
246 typedef _BitInt(33) IllegalMode __attribute__((mode(DI)));
247
248 void ImplicitCasts(_BitInt(31) s31, _BitInt(33) s33, int i) {
249 // expected-warning@+1{{implicit conversion loses integer precision}}
250 s31 = i;
251 // expected-warning@+1{{implicit conversion loses integer precision}}
252 s31 = s33;
253 s33 = i;
254 s33 = s31;
255 i = s31;
256 // expected-warning@+1{{implicit conversion loses integer precision}}
257 i = s33;
258 }
259
260 void Ternary(_BitInt(30) s30, _BitInt(31) s31a, _BitInt(31) s31b,
261 _BitInt(32) s32, bool b) {
262 b ? s30 : s31a;
263 b ? s31a : s30;
264 b ? s32 : (int)0;
265 (void)(b ? s31a : s31b);
266 (void)(s30 ? s31a : s31b);
267
268 static_assert(is_same<decltype(b ? s30 : s31a), _BitInt(31)>::value, "");
269 static_assert(is_same<decltype(b ? s32 : s30), _BitInt(32)>::value, "");
270 static_assert(is_same<decltype(b ? s30 : 0), int>::value, "");
271 }
272
FromPaper1()273 void FromPaper1() {
274 // Test the examples of conversion and promotion rules from C2x 6.3.1.8.
275 _BitInt(2) a2 = 1;
276 _BitInt(3) a3 = 2;
277 _BitInt(33) a33 = 1;
278 char c = 3;
279
280 static_assert(is_same<decltype(a2 * a3), _BitInt(3)>::value, "");
281 static_assert(is_same<decltype(a2 * c), int>::value, "");
282 static_assert(is_same<decltype(a33 * c), _BitInt(33)>::value, "");
283 }
284
285 void FromPaper2(_BitInt(8) a1, _BitInt(24) a2) {
286 static_assert(is_same<decltype(a1 * (_BitInt(32))a2), _BitInt(32)>::value, "");
287 }
288