msg_132_ilp32.c revision 1.4 1 /* $NetBSD: msg_132_ilp32.c,v 1.4 2023/08/08 19:57:23 rillig Exp $ */
2 # 3 "msg_132_ilp32.c"
3
4 // Test for message: conversion from '%s' to '%s' may lose accuracy [132]
5
6 /*
7 * On 32-bit platforms, it is possible to add a 64-bit integer to a 32-bit
8 * pointer. The 64-bit integer is then converted to the ptrdiff_t of the
9 * target platform, which results in the non-obvious conversion from
10 * 'long long' to either 'long' or 'int', depending on the platform's
11 * ptrdiff_t.
12 */
13
14 /* lint1-only-if: ilp32 int */
15 /* lint1-extra-flags: -a -X 351 */
16
17 /*
18 * Seen in usr.bin/make/var.c, function RegexReplace, in the function call
19 * SepBuf_AddBytesBetween(buf, wp + m[0].rm_so, wp + m[0].rm_eo). The
20 * offsets of regular expression matches have type off_t, which is a 64-bit
21 * integer.
22 *
23 * C11 6.5.6p8 does not explicitly define the meaning of a pointer + an
24 * overly long integer, it just says "undefined behavior" if the resulting
25 * pointer would be outside the object.
26 */
27 const char *
28 array_subscript(const char *p, long long idx)
29 {
30 /* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
31 return p + idx;
32 }
33
34 /*
35 * On ILP32 platforms, pointer, long and int have the same size, so there is
36 * no loss of accuracy.
37 */
38 unsigned int
39 convert_pointer_to_smaller_integer(void *ptr)
40 {
41 return (unsigned long)(ptr) >> 12;
42 }
43
44 _Bool bool_var;
45 char char_var;
46 signed char schar_var;
47 unsigned char uchar_var;
48 short short_var;
49 unsigned short ushort_var;
50 int int_var;
51 unsigned int uint_var;
52 long long_var;
53 unsigned long ulong_var;
54 long long llong_var;
55 unsigned long long ullong_var;
56
57 void
58 convert_all(void)
59 {
60 bool_var = bool_var;
61 bool_var = char_var;
62 bool_var = schar_var;
63 bool_var = uchar_var;
64 bool_var = short_var;
65 bool_var = ushort_var;
66 bool_var = int_var;
67 bool_var = uint_var;
68 bool_var = long_var;
69 bool_var = ulong_var;
70 bool_var = llong_var;
71 bool_var = ullong_var;
72
73 char_var = bool_var;
74 char_var = char_var;
75 char_var = schar_var;
76 char_var = uchar_var;
77 char_var = short_var;
78 char_var = ushort_var;
79 /* expect+1: warning: conversion from 'int' to 'char' may lose accuracy [132] */
80 char_var = int_var;
81 /* expect+1: warning: conversion from 'unsigned int' to 'char' may lose accuracy [132] */
82 char_var = uint_var;
83 /* expect+1: warning: conversion from 'long' to 'char' may lose accuracy [132] */
84 char_var = long_var;
85 /* expect+1: warning: conversion from 'unsigned long' to 'char' may lose accuracy [132] */
86 char_var = ulong_var;
87 /* expect+1: warning: conversion from 'long long' to 'char' may lose accuracy [132] */
88 char_var = llong_var;
89 /* expect+1: warning: conversion from 'unsigned long long' to 'char' may lose accuracy [132] */
90 char_var = ullong_var;
91
92 schar_var = bool_var;
93 schar_var = char_var;
94 schar_var = schar_var;
95 schar_var = uchar_var;
96 schar_var = short_var;
97 schar_var = ushort_var;
98 /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
99 schar_var = int_var;
100 /* expect+1: warning: conversion from 'unsigned int' to 'signed char' may lose accuracy [132] */
101 schar_var = uint_var;
102 /* expect+1: warning: conversion from 'long' to 'signed char' may lose accuracy [132] */
103 schar_var = long_var;
104 /* expect+1: warning: conversion from 'unsigned long' to 'signed char' may lose accuracy [132] */
105 schar_var = ulong_var;
106 /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
107 schar_var = llong_var;
108 /* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
109 schar_var = ullong_var;
110
111 uchar_var = bool_var;
112 uchar_var = char_var;
113 uchar_var = schar_var;
114 uchar_var = uchar_var;
115 uchar_var = short_var;
116 uchar_var = ushort_var;
117 /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
118 uchar_var = int_var;
119 /* expect+1: warning: conversion from 'unsigned int' to 'unsigned char' may lose accuracy [132] */
120 uchar_var = uint_var;
121 /* expect+1: warning: conversion from 'long' to 'unsigned char' may lose accuracy [132] */
122 uchar_var = long_var;
123 /* expect+1: warning: conversion from 'unsigned long' to 'unsigned char' may lose accuracy [132] */
124 uchar_var = ulong_var;
125 /* expect+1: warning: conversion from 'long long' to 'unsigned char' may lose accuracy [132] */
126 uchar_var = llong_var;
127 /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
128 uchar_var = ullong_var;
129
130 short_var = bool_var;
131 short_var = char_var;
132 short_var = schar_var;
133 short_var = uchar_var;
134 short_var = short_var;
135 short_var = ushort_var;
136 /* expect+1: warning: conversion from 'int' to 'short' may lose accuracy [132] */
137 short_var = int_var;
138 /* expect+1: warning: conversion from 'unsigned int' to 'short' may lose accuracy [132] */
139 short_var = uint_var;
140 /* expect+1: warning: conversion from 'long' to 'short' may lose accuracy [132] */
141 short_var = long_var;
142 /* expect+1: warning: conversion from 'unsigned long' to 'short' may lose accuracy [132] */
143 short_var = ulong_var;
144 /* expect+1: warning: conversion from 'long long' to 'short' may lose accuracy [132] */
145 short_var = llong_var;
146 /* expect+1: warning: conversion from 'unsigned long long' to 'short' may lose accuracy [132] */
147 short_var = ullong_var;
148
149 ushort_var = bool_var;
150 ushort_var = char_var;
151 ushort_var = schar_var;
152 ushort_var = uchar_var;
153 ushort_var = short_var;
154 ushort_var = ushort_var;
155 /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
156 ushort_var = int_var;
157 /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
158 ushort_var = uint_var;
159 /* expect+1: warning: conversion from 'long' to 'unsigned short' may lose accuracy [132] */
160 ushort_var = long_var;
161 /* expect+1: warning: conversion from 'unsigned long' to 'unsigned short' may lose accuracy [132] */
162 ushort_var = ulong_var;
163 /* expect+1: warning: conversion from 'long long' to 'unsigned short' may lose accuracy [132] */
164 ushort_var = llong_var;
165 /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned short' may lose accuracy [132] */
166 ushort_var = ullong_var;
167
168 int_var = bool_var;
169 int_var = char_var;
170 int_var = schar_var;
171 int_var = uchar_var;
172 int_var = short_var;
173 int_var = ushort_var;
174 int_var = int_var;
175 int_var = uint_var;
176 int_var = long_var;
177 int_var = ulong_var;
178 /* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
179 int_var = llong_var;
180 /* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
181 int_var = ullong_var;
182
183 uint_var = bool_var;
184 uint_var = char_var;
185 uint_var = schar_var;
186 uint_var = uchar_var;
187 uint_var = short_var;
188 uint_var = ushort_var;
189 uint_var = int_var;
190 uint_var = uint_var;
191 uint_var = long_var;
192 uint_var = ulong_var;
193 /* expect+1: warning: conversion from 'long long' to 'unsigned int' may lose accuracy [132] */
194 uint_var = llong_var;
195 /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
196 uint_var = ullong_var;
197
198 long_var = bool_var;
199 long_var = char_var;
200 long_var = schar_var;
201 long_var = uchar_var;
202 long_var = short_var;
203 long_var = ushort_var;
204 long_var = int_var;
205 long_var = uint_var;
206 long_var = long_var;
207 long_var = ulong_var;
208 /* expect+1: warning: conversion from 'long long' to 'long' may lose accuracy [132] */
209 long_var = llong_var;
210 /* expect+1: warning: conversion from 'unsigned long long' to 'long' may lose accuracy [132] */
211 long_var = ullong_var;
212
213 ulong_var = bool_var;
214 ulong_var = char_var;
215 ulong_var = schar_var;
216 ulong_var = uchar_var;
217 ulong_var = short_var;
218 ulong_var = ushort_var;
219 ulong_var = int_var;
220 ulong_var = uint_var;
221 ulong_var = long_var;
222 ulong_var = ulong_var;
223 /* expect+1: warning: conversion from 'long long' to 'unsigned long' may lose accuracy [132] */
224 ulong_var = llong_var;
225 /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned long' may lose accuracy [132] */
226 ulong_var = ullong_var;
227
228 llong_var = bool_var;
229 llong_var = char_var;
230 llong_var = schar_var;
231 llong_var = uchar_var;
232 llong_var = short_var;
233 llong_var = ushort_var;
234 llong_var = int_var;
235 llong_var = uint_var;
236 llong_var = long_var;
237 llong_var = ulong_var;
238 llong_var = llong_var;
239 llong_var = ullong_var;
240
241 ullong_var = bool_var;
242 ullong_var = char_var;
243 ullong_var = schar_var;
244 ullong_var = uchar_var;
245 ullong_var = short_var;
246 ullong_var = ushort_var;
247 ullong_var = int_var;
248 ullong_var = uint_var;
249 ullong_var = long_var;
250 ullong_var = ulong_var;
251 ullong_var = llong_var;
252 ullong_var = ullong_var;
253 }
254