xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_132_ilp32.c (revision 7e8e260d9fbe100228c63c0401f78c1bd9a7d3c3)
1 /*	$NetBSD: msg_132_ilp32.c,v 1.5 2023/08/08 20:15:11 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 *
array_subscript(const char * p,long long idx)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
convert_pointer_to_smaller_integer(void * ptr)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
convert_all(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 	char_var = int_var;
80 	char_var = uint_var;
81 	/* expect+1: warning: conversion from 'long' to 'char' may lose accuracy [132] */
82 	char_var = long_var;
83 	/* expect+1: warning: conversion from 'unsigned long' to 'char' may lose accuracy [132] */
84 	char_var = ulong_var;
85 	/* expect+1: warning: conversion from 'long long' to 'char' may lose accuracy [132] */
86 	char_var = llong_var;
87 	/* expect+1: warning: conversion from 'unsigned long long' to 'char' may lose accuracy [132] */
88 	char_var = ullong_var;
89 
90 	schar_var = bool_var;
91 	schar_var = char_var;
92 	schar_var = schar_var;
93 	schar_var = uchar_var;
94 	schar_var = short_var;
95 	schar_var = ushort_var;
96 	schar_var = int_var;
97 	schar_var = uint_var;
98 	/* expect+1: warning: conversion from 'long' to 'signed char' may lose accuracy [132] */
99 	schar_var = long_var;
100 	/* expect+1: warning: conversion from 'unsigned long' to 'signed char' may lose accuracy [132] */
101 	schar_var = ulong_var;
102 	/* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
103 	schar_var = llong_var;
104 	/* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
105 	schar_var = ullong_var;
106 
107 	uchar_var = bool_var;
108 	uchar_var = char_var;
109 	uchar_var = schar_var;
110 	uchar_var = uchar_var;
111 	uchar_var = short_var;
112 	uchar_var = ushort_var;
113 	uchar_var = int_var;
114 	uchar_var = uint_var;
115 	/* expect+1: warning: conversion from 'long' to 'unsigned char' may lose accuracy [132] */
116 	uchar_var = long_var;
117 	/* expect+1: warning: conversion from 'unsigned long' to 'unsigned char' may lose accuracy [132] */
118 	uchar_var = ulong_var;
119 	/* expect+1: warning: conversion from 'long long' to 'unsigned char' may lose accuracy [132] */
120 	uchar_var = llong_var;
121 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
122 	uchar_var = ullong_var;
123 
124 	short_var = bool_var;
125 	short_var = char_var;
126 	short_var = schar_var;
127 	short_var = uchar_var;
128 	short_var = short_var;
129 	short_var = ushort_var;
130 	short_var = int_var;
131 	short_var = uint_var;
132 	/* expect+1: warning: conversion from 'long' to 'short' may lose accuracy [132] */
133 	short_var = long_var;
134 	/* expect+1: warning: conversion from 'unsigned long' to 'short' may lose accuracy [132] */
135 	short_var = ulong_var;
136 	/* expect+1: warning: conversion from 'long long' to 'short' may lose accuracy [132] */
137 	short_var = llong_var;
138 	/* expect+1: warning: conversion from 'unsigned long long' to 'short' may lose accuracy [132] */
139 	short_var = ullong_var;
140 
141 	ushort_var = bool_var;
142 	ushort_var = char_var;
143 	ushort_var = schar_var;
144 	ushort_var = uchar_var;
145 	ushort_var = short_var;
146 	ushort_var = ushort_var;
147 	ushort_var = int_var;
148 	ushort_var = uint_var;
149 	/* expect+1: warning: conversion from 'long' to 'unsigned short' may lose accuracy [132] */
150 	ushort_var = long_var;
151 	/* expect+1: warning: conversion from 'unsigned long' to 'unsigned short' may lose accuracy [132] */
152 	ushort_var = ulong_var;
153 	/* expect+1: warning: conversion from 'long long' to 'unsigned short' may lose accuracy [132] */
154 	ushort_var = llong_var;
155 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned short' may lose accuracy [132] */
156 	ushort_var = ullong_var;
157 
158 	int_var = bool_var;
159 	int_var = char_var;
160 	int_var = schar_var;
161 	int_var = uchar_var;
162 	int_var = short_var;
163 	int_var = ushort_var;
164 	int_var = int_var;
165 	int_var = uint_var;
166 	int_var = long_var;
167 	int_var = ulong_var;
168 	/* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
169 	int_var = llong_var;
170 	/* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
171 	int_var = ullong_var;
172 
173 	uint_var = bool_var;
174 	uint_var = char_var;
175 	uint_var = schar_var;
176 	uint_var = uchar_var;
177 	uint_var = short_var;
178 	uint_var = ushort_var;
179 	uint_var = int_var;
180 	uint_var = uint_var;
181 	uint_var = long_var;
182 	uint_var = ulong_var;
183 	/* expect+1: warning: conversion from 'long long' to 'unsigned int' may lose accuracy [132] */
184 	uint_var = llong_var;
185 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
186 	uint_var = ullong_var;
187 
188 	long_var = bool_var;
189 	long_var = char_var;
190 	long_var = schar_var;
191 	long_var = uchar_var;
192 	long_var = short_var;
193 	long_var = ushort_var;
194 	long_var = int_var;
195 	long_var = uint_var;
196 	long_var = long_var;
197 	long_var = ulong_var;
198 	/* expect+1: warning: conversion from 'long long' to 'long' may lose accuracy [132] */
199 	long_var = llong_var;
200 	/* expect+1: warning: conversion from 'unsigned long long' to 'long' may lose accuracy [132] */
201 	long_var = ullong_var;
202 
203 	ulong_var = bool_var;
204 	ulong_var = char_var;
205 	ulong_var = schar_var;
206 	ulong_var = uchar_var;
207 	ulong_var = short_var;
208 	ulong_var = ushort_var;
209 	ulong_var = int_var;
210 	ulong_var = uint_var;
211 	ulong_var = long_var;
212 	ulong_var = ulong_var;
213 	/* expect+1: warning: conversion from 'long long' to 'unsigned long' may lose accuracy [132] */
214 	ulong_var = llong_var;
215 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned long' may lose accuracy [132] */
216 	ulong_var = ullong_var;
217 
218 	llong_var = bool_var;
219 	llong_var = char_var;
220 	llong_var = schar_var;
221 	llong_var = uchar_var;
222 	llong_var = short_var;
223 	llong_var = ushort_var;
224 	llong_var = int_var;
225 	llong_var = uint_var;
226 	llong_var = long_var;
227 	llong_var = ulong_var;
228 	llong_var = llong_var;
229 	llong_var = ullong_var;
230 
231 	ullong_var = bool_var;
232 	ullong_var = char_var;
233 	ullong_var = schar_var;
234 	ullong_var = uchar_var;
235 	ullong_var = short_var;
236 	ullong_var = ushort_var;
237 	ullong_var = int_var;
238 	ullong_var = uint_var;
239 	ullong_var = long_var;
240 	ullong_var = ulong_var;
241 	ullong_var = llong_var;
242 	ullong_var = ullong_var;
243 }
244