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