1+ // Assumed platform in qltest is linux_x86_64, so
2+ // int, long, long long sizes are assumed to be 32, 64, 64 bits respectively
13
2- long a1 = 0L; // COMPLIANT
3- long a2 = 0LL; // COMPLIANT
4- long a3 = 0uL; // COMPLIANT
5- long a4 = 0Lu; // COMPLIANT
6- long a5 = 0LU; // COMPLIANT
7-
8- unsigned long b1 = 0L; // NON_COMPLIANT
9- unsigned long b2 = 0LL; // NON_COMPLIANT
10- unsigned long b3 = 0uL; // COMPLIANT
11- unsigned long b4 = 0Lu; // COMPLIANT
12- unsigned long b5 = 0LU; // COMPLIANT
13-
14- signed long c1 = 0L; // COMPLIANT
15- signed long c2 = 0LL; // COMPLIANT
16- signed long c3 = 0uL; // COMPLIANT
17- signed long c4 = 0Lu; // COMPLIANT
18- signed long c5 = 0LU; // COMPLIANT
19-
20- void f0(int a) {}
21-
22- void f1(unsigned int a) {}
23-
24- void f2() {
25-
26- f0(1); // COMPLIANT
27- f0(1U); // COMPLIANT
28- f0(0x01); // COMPLIANT
29- f0(0x01U); // COMPLIANT
30- f0(001); // COMPLIANT
31- f0(001U); // COMPLIANT
32-
33- f1(1); // NON_COMPLIANT
34- f1(1U); // COMPLIANT
35- f1(0x01); // NON_COMPLIANT
36- f1(0x01U); // COMPLIANT
37- f1(001); // NON_COMPLIANT
38- f1(001U); // COMPLIANT
4+ // The type of an integer constant is determined by "6.4.4.1 Integer constants"
5+ // in the C11 Standard. The principle is that any decimal integer constant will
6+ // be signed, unless it has the `U` or `u` suffix. Any hexadecimal integer will
7+ // depend on whether it is larger than the maximum value of the smallest signed
8+ // integer value that can hold the value. So the signedness depends on the
9+ // magnitude of the constant.
10+
11+ void test_decimal_constants() {
12+ 0; // COMPLIANT
13+ 2147483648; // COMPLIANT - larger than int, but decimal constants never use
14+ // unsigned without the suffix, so will be `long`
15+ 4294967296; // COMPLIANT - larger than unsigned int, still `long`
16+ 9223372036854775807; // COMPLIANT - max long int
17+ // 9223372036854775808; Not a valid integer constant, out of signed range
18+ 0U; // COMPLIANT - unsigned, but uses the suffix correctly
19+ 2147483648U; // COMPLIANT - unsigned, but uses the suffix correctly
20+ 4294967296U; // COMPLIANT - unsigned, but uses the suffix correctly
21+ 9223372036854775807U; // COMPLIANT - max long int
22+ 9223372036854775808U; // COMPLIANT - explicitly unsigned, so can go large than
23+ // max long int
24+ 0u; // COMPLIANT - unsigned, but uses the suffix correctly
25+ 2147483648u; // COMPLIANT - unsigned, but uses the suffix correctly
26+ 4294967296u; // COMPLIANT - unsigned, but uses the suffix correctly
27+ 9223372036854775807u; // COMPLIANT - max long int
28+ 9223372036854775808u; // COMPLIANT - explicitly unsigned, so can go large than
29+ // max long int
30+
31+ // l suffix
32+ 0l; // COMPLIANT
33+ 2147483648l; // COMPLIANT - within the range of long int
34+ 4294967296l; // COMPLIANT - within the range of long int
35+ 9223372036854775807l; // COMPLIANT - max long int
36+ // 9223372036854775808l; Not a valid integer constant, out of signed range
37+ 0lU; // COMPLIANT - unsigned, but uses the suffix correctly
38+ 2147483648lU; // COMPLIANT - unsigned, but uses the suffix correctly
39+ 4294967296lU; // COMPLIANT - unsigned, but uses the suffix correctly
40+ 9223372036854775807lU; // COMPLIANT - max long int
41+ 9223372036854775808lU; // COMPLIANT - explicitly unsigned, so can go large
42+ // than max long int
43+ 0lu; // COMPLIANT - unsigned, but uses the suffix correctly
44+ 2147483648lu; // COMPLIANT - unsigned, but uses the suffix correctly
45+ 4294967296lu; // COMPLIANT - unsigned, but uses the suffix correctly
46+ 9223372036854775807lu; // COMPLIANT - max long int
47+ 9223372036854775808lu; // COMPLIANT - explicitly unsigned, so can go large
48+ // than max long int
49+
50+ // L suffix
51+ 0L; // COMPLIANT
52+ 2147483648L; // COMPLIANT - within the range of long int
53+ 4294967296L; // COMPLIANT - within the range of long int
54+ 9223372036854775807L; // COMPLIANT - max long int
55+ // 9223372036854775808L; Not a valid integer constant, out of signed range
56+ 0LU; // COMPLIANT - unsigned, but uses the suffix correctly
57+ 2147483648LU; // COMPLIANT - unsigned, but uses the suffix correctly
58+ 4294967296LU; // COMPLIANT - unsigned, but uses the suffix correctly
59+ 9223372036854775807LU; // COMPLIANT - max long int
60+ 9223372036854775808LU; // COMPLIANT - explicitly unsigned, so can go large
61+ // than max long int
62+ 0Lu; // COMPLIANT - unsigned, but uses the suffix correctly
63+ 2147483648Lu; // COMPLIANT - unsigned, but uses the suffix correctly
64+ 4294967296Lu; // COMPLIANT - unsigned, but uses the suffix correctly
65+ 9223372036854775807Lu; // COMPLIANT - max long int
66+ 9223372036854775808Lu; // COMPLIANT - explicitly unsigned, so can go large
67+ // than max long int
68+
69+ // ll suffix
70+ 0ll; // COMPLIANT
71+ 2147483648ll; // COMPLIANT - within the range of long long int
72+ 4294967296ll; // COMPLIANT - within the range of long long int
73+ 9223372036854775807ll; // COMPLIANT - max long long int
74+ // 9223372036854775808ll; Not a valid integer constant, out of signed range
75+ 0llU; // COMPLIANT - unsigned, but uses the suffix correctly
76+ 2147483648llU; // COMPLIANT - unsigned, but uses the suffix correctly
77+ 4294967296llU; // COMPLIANT - unsigned, but uses the suffix correctly
78+ 9223372036854775807llU; // COMPLIANT - max long long int
79+ 9223372036854775808llU; // COMPLIANT - explicitly unsigned, so can go large
80+ // than max long long int
81+ 0llu; // COMPLIANT - unsigned, but uses the suffix correctly
82+ 2147483648llu; // COMPLIANT - unsigned, but uses the suffix correctly
83+ 4294967296llu; // COMPLIANT - unsigned, but uses the suffix correctly
84+ 9223372036854775807llu; // COMPLIANT - max long long int
85+ 9223372036854775808llu; // COMPLIANT - explicitly unsigned, so can go large
86+ // than max long long int
87+
88+ // LL suffix
89+ 0LL; // COMPLIANT
90+ 2147483648LL; // COMPLIANT - within the range of long long int
91+ 4294967296LL; // COMPLIANT - within the range of long long int
92+ 9223372036854775807LL; // COMPLIANT - max long long int
93+ // 9223372036854775808LL; Not a valid integer constant, out of signed range
94+ 0LLU; // COMPLIANT - unsigned, but uses the suffix correctly
95+ 2147483648LLU; // COMPLIANT - unsigned, but uses the suffix correctly
96+ 4294967296LLU; // COMPLIANT - unsigned, but uses the suffix correctly
97+ 9223372036854775807LLU; // COMPLIANT - max long long int
98+ 9223372036854775808LLU; // COMPLIANT - explicitly unsigned, so can go large
99+ // than max long long int
100+ 0LLu; // COMPLIANT - unsigned, but uses the suffix correctly
101+ 2147483648LLu; // COMPLIANT - unsigned, but uses the suffix correctly
102+ 4294967296LLu; // COMPLIANT - unsigned, but uses the suffix correctly
103+ 9223372036854775807LLu; // COMPLIANT - max long long int
104+ 9223372036854775808LLu; // COMPLIANT - explicitly unsigned, so can go large
105+ // than max long long int
39106}
107+
108+ void test_hexadecimal_constants() {
109+ 0x0; // COMPLIANT - uses signed int
110+ 0x7FFFFFFF; // COMPLIANT - max value held by signed int
111+ 0x80000000; // NON_COMPLIANT - larger than max signed int, so will be unsigned
112+ // int
113+ 0x100000000; // COMPLIANT - larger than unsigned int, but smaller than long
114+ // int
115+ 0x7FFFFFFFFFFFFFFF; // COMPLIANT - max long int
116+ 0x8000000000000000; // NON_COMPLIANT - larger than long int, so will be
117+ // unsigned long int
118+ 0x0U; // COMPLIANT - unsigned, but uses the suffix correctly
119+ 0x7FFFFFFFU; // COMPLIANT - unsigned, but uses the suffix correctly
120+ 0x80000000U; // COMPLIANT - unsigned, but uses the suffix correctly
121+ 0x100000000U; // COMPLIANT - unsigned, but uses the suffix correctly
122+ 0x7FFFFFFFFFFFFFFFU; // COMPLIANT - unsigned, but uses the suffix correctly
123+ 0x8000000000000000U; // COMPLIANT - unsigned, but uses the suffix correctly
124+ 0x0u; // COMPLIANT - unsigned, but uses the suffix correctly
125+ 0x7FFFFFFFu; // COMPLIANT - unsigned, but uses the suffix correctly
126+ 0x80000000u; // COMPLIANT - unsigned, but uses the suffix correctly
127+ 0x100000000u; // COMPLIANT - unsigned, but uses the suffix correctly
128+ 0x7FFFFFFFFFFFFFFFu; // COMPLIANT - unsigned, but uses the suffix correctly
129+ 0x8000000000000000u; // COMPLIANT - unsigned, but uses the suffix correctly
130+
131+ // Use of the `l` suffix
132+ 0x0l; // COMPLIANT - uses signed int
133+ 0x7FFFFFFFl; // COMPLIANT - max value held by signed int
134+ 0x80000000l; // COMPLIANT - larger than max signed int, but smaller than long
135+ // int
136+ 0x100000000l; // COMPLIANT - larger than unsigned int, but smaller than long
137+ // int
138+ 0x7FFFFFFFFFFFFFFFl; // COMPLIANT - max long int
139+ 0x8000000000000000l; // NON_COMPLIANT - larger than long int, so will be
140+ // unsigned long int
141+ 0x0lU; // COMPLIANT - unsigned, but uses the suffix correctly
142+ 0x7FFFFFFFlU; // COMPLIANT - unsigned, but uses the suffix correctly
143+ 0x80000000lU; // COMPLIANT - unsigned, but uses the suffix correctly
144+ 0x100000000lU; // COMPLIANT - unsigned, but uses the suffix correctly
145+ 0x7FFFFFFFFFFFFFFFlU; // COMPLIANT - unsigned, but uses the suffix correctly
146+ 0x8000000000000000lU; // COMPLIANT - unsigned, but uses the suffix correctly
147+ 0x0lu; // COMPLIANT - unsigned, but uses the suffix correctly
148+ 0x7FFFFFFFlu; // COMPLIANT - unsigned, but uses the suffix correctly
149+ 0x80000000lu; // COMPLIANT - unsigned, but uses the suffix correctly
150+ 0x100000000lu; // COMPLIANT - unsigned, but uses the suffix correctly
151+ 0x7FFFFFFFFFFFFFFFlu; // COMPLIANT - unsigned, but uses the suffix correctly
152+ 0x8000000000000000lu; // COMPLIANT - unsigned, but uses the suffix correctly
153+
154+ // Use of the `L` suffix
155+ 0x0L; // COMPLIANT - uses signed int
156+ 0x7FFFFFFFL; // COMPLIANT - max value held by signed int
157+ 0x80000000L; // COMPLIANT - larger than max signed int, but smaller than long
158+ // int
159+ 0x100000000L; // COMPLIANT - larger than unsigned int, but smaller than long
160+ // int
161+ 0x7FFFFFFFFFFFFFFFL; // COMPLIANT - max long int
162+ 0x8000000000000000L; // NON_COMPLIANT - larger than long int, so will be
163+ // unsigned long int
164+ 0x0LU; // COMPLIANT - unsigned, but uses the suffix correctly
165+ 0x7FFFFFFFLU; // COMPLIANT - unsigned, but uses the suffix correctly
166+ 0x80000000LU; // COMPLIANT - unsigned, but uses the suffix correctly
167+ 0x100000000LU; // COMPLIANT - unsigned, but uses the suffix correctly
168+ 0x7FFFFFFFFFFFFFFFLU; // COMPLIANT - unsigned, but uses the suffix correctly
169+ 0x8000000000000000LU; // COMPLIANT - unsigned, but uses the suffix correctly
170+ 0x0Lu; // COMPLIANT - unsigned, but uses the suffix correctly
171+ 0x7FFFFFFFLu; // COMPLIANT - unsigned, but uses the suffix correctly
172+ 0x80000000Lu; // COMPLIANT - unsigned, but uses the suffix correctly
173+ 0x100000000Lu; // COMPLIANT - unsigned, but uses the suffix correctly
174+ 0x7FFFFFFFFFFFFFFFLu; // COMPLIANT - unsigned, but uses the suffix correctly
175+ 0x8000000000000000Lu; // COMPLIANT - unsigned, but uses the suffix correctly
176+
177+ // Use of the `ll` suffix
178+ 0x0ll; // COMPLIANT - uses signed int
179+ 0x7FFFFFFFll; // COMPLIANT - max value held by signed int
180+ 0x80000000ll; // COMPLIANT - larger than max signed int, but smaller than long
181+ // long int
182+ 0x100000000ll; // COMPLIANT - larger than unsigned int, but smaller than long
183+ // long int
184+ 0x7FFFFFFFFFFFFFFFll; // COMPLIANT - max long long int
185+ 0x8000000000000000ll; // NON_COMPLIANT - larger than long long int, so will be
186+ // unsigned long long int
187+ 0x0llU; // COMPLIANT - unsigned, but uses the suffix correctly
188+ 0x7FFFFFFFllU; // COMPLIANT - unsigned, but uses the suffix correctly
189+ 0x80000000llU; // COMPLIANT - unsigned, but uses the suffix correctly
190+ 0x100000000llU; // COMPLIANT - unsigned, but uses the suffix correctly
191+ 0x7FFFFFFFFFFFFFFFllU; // COMPLIANT - unsigned, but uses the suffix correctly
192+ 0x8000000000000000llU; // COMPLIANT - unsigned, but uses the suffix correctly
193+ 0x0llu; // COMPLIANT - unsigned, but uses the suffix correctly
194+ 0x7FFFFFFFllu; // COMPLIANT - unsigned, but uses the suffix correctly
195+ 0x80000000llu; // COMPLIANT - unsigned, but uses the suffix correctly
196+ 0x100000000llu; // COMPLIANT - unsigned, but uses the suffix correctly
197+ 0x7FFFFFFFFFFFFFFFllu; // COMPLIANT - unsigned, but uses the suffix correctly
198+ 0x8000000000000000llu; // COMPLIANT - unsigned, but uses the suffix correctly
199+
200+ // Use of the `LL` suffix
201+ 0x0LL; // COMPLIANT - uses signed int
202+ 0x7FFFFFFFLL; // COMPLIANT - max value held by signed int
203+ 0x80000000LL; // COMPLIANT - larger than max signed int, but smaller than long
204+ // long int
205+ 0x100000000LL; // COMPLIANT - larger than unsigned int, but smaller than long
206+ // long int
207+ 0x7FFFFFFFFFFFFFFFLL; // COMPLIANT - max long long int
208+ 0x8000000000000000LL; // NON_COMPLIANT - larger than long long int, so will be
209+ // unsigned long long int
210+ 0x0LLU; // COMPLIANT - unsigned, but uses the suffix correctly
211+ 0x7FFFFFFFLLU; // COMPLIANT - unsigned, but uses the suffix correctly
212+ 0x80000000LLU; // COMPLIANT - unsigned, but uses the suffix correctly
213+ 0x100000000LLU; // COMPLIANT - unsigned, but uses the suffix correctly
214+ 0x7FFFFFFFFFFFFFFFLLU; // COMPLIANT - unsigned, but uses the suffix correctly
215+ 0x8000000000000000LLU; // COMPLIANT - unsigned, but uses the suffix correctly
216+ 0x0LLu; // COMPLIANT - unsigned, but uses the suffix correctly
217+ 0x7FFFFFFFLLu; // COMPLIANT - unsigned, but uses the suffix correctly
218+ 0x80000000LLu; // COMPLIANT - unsigned, but uses the suffix correctly
219+ 0x100000000LLu; // COMPLIANT - unsigned, but uses the suffix correctly
220+ 0x7FFFFFFFFFFFFFFFLLu; // COMPLIANT - unsigned, but uses the suffix correctly
221+ 0x8000000000000000LLu; // COMPLIANT - unsigned, but uses the suffix correctly
222+ }
223+
224+ #define COMPLIANT_VAL 0x80000000U
225+ #define NON_COMPLIANT_VAL 0x80000000
226+
227+ void test_macro() {
228+ COMPLIANT_VAL; // COMPLIANT
229+ NON_COMPLIANT_VAL; // NON_COMPLIANT[FALSE_NEGATIVE] - cannot determine suffix
230+ // in macro expansions
231+ }
0 commit comments