1 // RUN: %clang_cc1 -fsyntax-only -verify %s -Wimplicit-int-conversion -Wno-unused -Wunevaluated-expression -triple x86_64-gnu-linux
6 unsigned _BitInt(Bounds
) b2
;
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}}
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
;
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}}
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}}
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;
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}}
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 }}
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 }}
44 // expected-error@5{{signed _BitInt must have a bit size of at least 2}}
45 // expected-note@+1{{in instantiation of template class }}
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'}}
55 template <_BitInt(5) I
>
56 struct ExtIntTemplParam
{
57 static constexpr _BitInt(5) Var
= I
;
61 void deduced_whole_type(T
){}
63 void deduced_bound(_BitInt(I
)){}
65 // Ensure ext-int can be used in template places.
67 ExtIntTemplParam
<13> a
;
68 constexpr _BitInt(3) b
= 1;
69 ExtIntTemplParam
<b
> c
;
70 constexpr _BitInt(9) d
= 1;
71 ExtIntTemplParam
<b
> e
;
73 deduced_whole_type(b
);
77 template <typename T
, typename U
>
79 static constexpr bool value
= false;
83 static constexpr bool value
= true;
86 // Reject vector types:
87 // expected-error@+1{{invalid vector element type '_BitInt(32)'}}
88 typedef _BitInt(32) __attribute__((vector_size(16))) VecTy
;
89 // expected-error@+1{{invalid vector element type '_BitInt(32)'}}
90 typedef _BitInt(32) __attribute__((ext_vector_type(32))) OtherVecTy
;
93 _Complex
_BitInt(3) Cmplx
;
95 // Reject cases of _Atomic:
96 // expected-error@+1{{_Atomic cannot be applied to integer type '_BitInt(4)'}}
97 _Atomic
_BitInt(4) TooSmallAtomic
;
98 // expected-error@+1{{_Atomic cannot be applied to integer type '_BitInt(9)'}}
99 _Atomic
_BitInt(9) NotPow2Atomic
;
100 // expected-error@+1{{_Atomic cannot be applied to integer type '_BitInt(128)'}}
101 _Atomic
_BitInt(128) JustRightAtomic
;
103 // Test result types of Unary/Bitwise/Binary Operations:
105 _BitInt(43) x43_s
= 1, y43_s
= 1;
106 _BitInt(sizeof(int) * 8) x32_s
= 1, y32_s
= 1;
107 unsigned _BitInt(sizeof(unsigned) * 8) x32_u
= 1, y32_u
= 1;
108 _BitInt(4) x4_s
= 1, y4_s
= 1;
109 unsigned _BitInt(43) x43_u
= 1, y43_u
= 1;
110 unsigned _BitInt(4) x4_u
= 1, y4_u
= 1;
111 int x_int
= 1, y_int
= 1;
112 unsigned x_uint
= 1, y_uint
= 1;
115 // Signed/unsigned mixed.
127 // Mixed with standard types.
140 static_assert(is_same
<decltype(x43_s
+ x_int
), _BitInt(43)>::value
, "");
141 static_assert(is_same
<decltype(x43_u
+ x_int
), unsigned _BitInt(43)>::value
, "");
142 static_assert(is_same
<decltype(x32_s
+ x_int
), int>::value
, "");
143 static_assert(is_same
<decltype(x32_u
+ x_int
), unsigned int>::value
, "");
144 static_assert(is_same
<decltype(x32_s
+ x_uint
), unsigned int>::value
, "");
145 static_assert(is_same
<decltype(x32_u
+ x_uint
), unsigned int>::value
, "");
146 static_assert(is_same
<decltype(x4_s
+ x_int
), int>::value
, "");
147 static_assert(is_same
<decltype(x4_u
+ x_int
), int>::value
, "");
148 static_assert(is_same
<decltype(x4_s
+ x_uint
), unsigned int>::value
, "");
149 static_assert(is_same
<decltype(x4_u
+ x_uint
), unsigned int>::value
, "");
162 x4_s
> 33; // expected-warning {{result of comparison of constant 33 with expression of type '_BitInt(4)' is always false}}
164 // Same size/sign ops don't change type.
165 static_assert(is_same
<decltype(x43_s
+ y43_s
), _BitInt(43)>::value
,"");
166 static_assert(is_same
<decltype(x4_s
- y4_s
), _BitInt(4)>::value
,"");
167 static_assert(is_same
<decltype(x43_u
* y43_u
), unsigned _BitInt(43)>::value
,"");
168 static_assert(is_same
<decltype(x4_u
/ y4_u
), unsigned _BitInt(4)>::value
,"");
170 // Unary ops shouldn't go through integer promotions.
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_s
), _BitInt(43)>::value
,"");
174 static_assert(is_same
<decltype(+x4_s
), _BitInt(4)>::value
,"");
175 static_assert(is_same
<decltype(-x43_u
), unsigned _BitInt(43)>::value
,"");
176 static_assert(is_same
<decltype(-x4_u
), unsigned _BitInt(4)>::value
,"");
177 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
178 static_assert(is_same
<decltype(++x43_s
), _BitInt(43)&>::value
,"");
179 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
180 static_assert(is_same
<decltype(--x4_s
), _BitInt(4)&>::value
,"");
181 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
182 static_assert(is_same
<decltype(x43_s
--), _BitInt(43)>::value
,"");
183 // expected-warning@+1{{expression with side effects has no effect in an unevaluated context}}
184 static_assert(is_same
<decltype(x4_s
++), _BitInt(4)>::value
,"");
185 static_assert(is_same
<decltype(x4_s
>> 1), _BitInt(4)>::value
,"");
186 static_assert(is_same
<decltype(x4_u
<< 1), unsigned _BitInt(4)>::value
,"");
188 static_assert(sizeof(x43_s
) == 8, "");
189 static_assert(sizeof(x4_s
) == 1, "");
191 static_assert(alignof(decltype(x43_s
)) == 8, "");
192 static_assert(alignof(decltype(x4_s
)) == 1, "");
195 constexpr int func() { return 42;}
197 void ConstexprBitsize() {
199 static_assert(is_same
<decltype(F
), _BitInt(42)>::value
, "");
202 // Useable as an underlying type.
203 enum AsEnumUnderlyingType
: _BitInt(33) {
206 void overloaded(int);
207 void overloaded(_BitInt(32));
208 void overloaded(_BitInt(33));
209 void overloaded(short);
210 //expected-note@+1{{candidate function}}
211 void overloaded2(_BitInt(32));
212 //expected-note@+1{{candidate function}}
213 void overloaded2(_BitInt(33));
214 //expected-note@+1{{candidate function}}
215 void overloaded2(short);
217 void overload_use() {
223 // All of these get their corresponding exact matches.
229 overloaded2(i
); // expected-error{{call to 'overloaded2' is ambiguous}}
236 // no errors expected, this should 'just work'.
237 struct UsedAsBitField
{
243 struct CursedBitField
{
244 _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}}
247 // expected-error@+1{{mode attribute only supported for integer and floating-point types}}
248 typedef _BitInt(33) IllegalMode
__attribute__((mode(DI
)));
250 void ImplicitCasts(_BitInt(31) s31
, _BitInt(33) s33
, int i
) {
251 // expected-warning@+1{{implicit conversion loses integer precision}}
253 // expected-warning@+1{{implicit conversion loses integer precision}}
258 // expected-warning@+1{{implicit conversion loses integer precision}}
262 void Ternary(_BitInt(30) s30
, _BitInt(31) s31a
, _BitInt(31) s31b
,
263 _BitInt(32) s32
, bool b
) {
267 (void)(b
? s31a
: s31b
);
268 (void)(s30
? s31a
: s31b
);
270 static_assert(is_same
<decltype(b
? s30
: s31a
), _BitInt(31)>::value
, "");
271 static_assert(is_same
<decltype(b
? s32
: s30
), _BitInt(32)>::value
, "");
272 static_assert(is_same
<decltype(b
? s30
: 0), int>::value
, "");
276 // Test the examples of conversion and promotion rules from C2x 6.3.1.8.
282 static_assert(is_same
<decltype(a2
* a3
), _BitInt(3)>::value
, "");
283 static_assert(is_same
<decltype(a2
* c
), int>::value
, "");
284 static_assert(is_same
<decltype(a33
* c
), _BitInt(33)>::value
, "");
287 void FromPaper2(_BitInt(8) a1
, _BitInt(24) a2
) {
288 static_assert(is_same
<decltype(a1
* (_BitInt(32))a2
), _BitInt(32)>::value
, "");