msg_132.c revision 1.20 1 1.20 rillig /* $NetBSD: msg_132.c,v 1.20 2022/07/02 09:48:18 rillig Exp $ */
2 1.1 rillig # 3 "msg_132.c"
3 1.1 rillig
4 1.1 rillig // Test for message: conversion from '%s' to '%s' may lose accuracy [132]
5 1.1 rillig
6 1.3 rillig /*
7 1.3 rillig * NetBSD's default lint flags only include a single -a, which only flags
8 1.3 rillig * narrowing conversions from long. To get warnings for all narrowing
9 1.9 rillig * conversions, -a needs to be given more than once.
10 1.3 rillig *
11 1.3 rillig * https://gnats.netbsd.org/14531
12 1.3 rillig */
13 1.3 rillig
14 1.3 rillig /* lint1-extra-flags: -aa */
15 1.3 rillig
16 1.20 rillig typedef unsigned char u8_t;
17 1.20 rillig typedef unsigned short u16_t;
18 1.20 rillig typedef unsigned int u32_t;
19 1.20 rillig typedef unsigned long long u64_t;
20 1.20 rillig typedef signed char s8_t;
21 1.20 rillig typedef signed short s16_t;
22 1.20 rillig typedef signed int s32_t;
23 1.20 rillig typedef signed long long s64_t;
24 1.20 rillig
25 1.20 rillig u8_t u8;
26 1.20 rillig u16_t u16;
27 1.20 rillig u32_t u32;
28 1.20 rillig u64_t u64;
29 1.20 rillig
30 1.20 rillig s8_t s8;
31 1.20 rillig s16_t s16;
32 1.20 rillig s32_t s32;
33 1.20 rillig s64_t s64;
34 1.3 rillig
35 1.3 rillig void
36 1.9 rillig unsigned_to_unsigned(void)
37 1.3 rillig {
38 1.18 rillig /* expect+1: warning: conversion from 'unsigned short' to 'unsigned char' may lose accuracy [132] */
39 1.18 rillig u8 = u16;
40 1.18 rillig /* expect+1: warning: conversion from 'unsigned int' to 'unsigned char' may lose accuracy [132] */
41 1.18 rillig u8 = u32;
42 1.18 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
43 1.18 rillig u8 = u64;
44 1.9 rillig
45 1.9 rillig u16 = u8;
46 1.18 rillig /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
47 1.18 rillig u16 = u32;
48 1.18 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned short' may lose accuracy [132] */
49 1.18 rillig u16 = u64;
50 1.9 rillig
51 1.9 rillig u32 = u8;
52 1.9 rillig u32 = u16;
53 1.18 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
54 1.18 rillig u32 = u64;
55 1.9 rillig
56 1.9 rillig u64 = u8;
57 1.9 rillig u64 = u16;
58 1.9 rillig u64 = u32;
59 1.3 rillig }
60 1.3 rillig
61 1.3 rillig void
62 1.9 rillig unsigned_to_signed(void)
63 1.3 rillig {
64 1.18 rillig /* expect+1: warning: conversion from 'unsigned short' to 'signed char' may lose accuracy [132] */
65 1.18 rillig s8 = u16;
66 1.18 rillig /* expect+1: warning: conversion from 'unsigned int' to 'signed char' may lose accuracy [132] */
67 1.18 rillig s8 = u32;
68 1.18 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
69 1.18 rillig s8 = u64;
70 1.9 rillig
71 1.9 rillig s16 = u8;
72 1.18 rillig /* expect+1: warning: conversion from 'unsigned int' to 'short' may lose accuracy [132] */
73 1.18 rillig s16 = u32;
74 1.18 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'short' may lose accuracy [132] */
75 1.18 rillig s16 = u64;
76 1.9 rillig
77 1.9 rillig s32 = u8;
78 1.9 rillig s32 = u16;
79 1.18 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
80 1.18 rillig s32 = u64;
81 1.9 rillig
82 1.9 rillig s64 = u8;
83 1.9 rillig s64 = u16;
84 1.9 rillig s64 = u32;
85 1.9 rillig }
86 1.9 rillig
87 1.9 rillig void
88 1.9 rillig signed_to_unsigned(void)
89 1.9 rillig {
90 1.18 rillig /* expect+1: warning: conversion from 'short' to 'unsigned char' may lose accuracy [132] */
91 1.18 rillig u8 = s16;
92 1.18 rillig /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
93 1.18 rillig u8 = s32;
94 1.18 rillig /* expect+1: warning: conversion from 'long long' to 'unsigned char' may lose accuracy [132] */
95 1.18 rillig u8 = s64;
96 1.9 rillig
97 1.9 rillig u16 = s8;
98 1.18 rillig /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
99 1.18 rillig u16 = s32;
100 1.18 rillig /* expect+1: warning: conversion from 'long long' to 'unsigned short' may lose accuracy [132] */
101 1.18 rillig u16 = s64;
102 1.9 rillig
103 1.9 rillig u32 = s8;
104 1.9 rillig u32 = s16;
105 1.18 rillig /* expect+1: warning: conversion from 'long long' to 'unsigned int' may lose accuracy [132] */
106 1.18 rillig u32 = s64;
107 1.9 rillig
108 1.9 rillig u64 = s8;
109 1.9 rillig u64 = s16;
110 1.9 rillig u64 = s32;
111 1.9 rillig }
112 1.9 rillig
113 1.9 rillig void
114 1.9 rillig signed_to_signed(void)
115 1.9 rillig {
116 1.18 rillig /* expect+1: warning: conversion from 'short' to 'signed char' may lose accuracy [132] */
117 1.18 rillig s8 = s16;
118 1.18 rillig /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
119 1.18 rillig s8 = s32;
120 1.18 rillig /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
121 1.18 rillig s8 = s64;
122 1.9 rillig
123 1.9 rillig s16 = s8;
124 1.18 rillig /* expect+1: warning: conversion from 'int' to 'short' may lose accuracy [132] */
125 1.18 rillig s16 = s32;
126 1.18 rillig /* expect+1: warning: conversion from 'long long' to 'short' may lose accuracy [132] */
127 1.18 rillig s16 = s64;
128 1.9 rillig
129 1.9 rillig s32 = s8;
130 1.9 rillig s32 = s16;
131 1.18 rillig /* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
132 1.18 rillig s32 = s64;
133 1.9 rillig
134 1.9 rillig s64 = s8;
135 1.9 rillig s64 = s16;
136 1.9 rillig s64 = s32;
137 1.3 rillig }
138 1.4 rillig
139 1.5 rillig /*
140 1.9 rillig * Before tree.c 1.268 from 2021-04-06, lint wrongly warned that conversion
141 1.9 rillig * to _Bool might lose accuracy. C99 6.3.1.2 defines a special conversion
142 1.9 rillig * rule from scalar to _Bool though by comparing the value to 0.
143 1.5 rillig */
144 1.4 rillig _Bool
145 1.4 rillig to_bool(long a, long b)
146 1.4 rillig {
147 1.4 rillig /* seen in fp_lib.h, function wideRightShiftWithSticky */
148 1.5 rillig return a | b;
149 1.4 rillig }
150 1.6 rillig
151 1.6 rillig /* ARGSUSED */
152 1.6 rillig const char *
153 1.6 rillig cover_build_plus_minus(const char *arr, double idx)
154 1.6 rillig {
155 1.19 rillig /* expect+3: error: operands of '+' have incompatible types 'pointer' and 'double' [107] */
156 1.6 rillig /* expect+2: warning: function 'cover_build_plus_minus' expects to return value [214] */
157 1.6 rillig if (idx > 0.0)
158 1.6 rillig return arr + idx;
159 1.6 rillig return arr + (unsigned int)idx;
160 1.6 rillig }
161 1.7 rillig
162 1.7 rillig int
163 1.7 rillig non_constant_expression(void)
164 1.7 rillig {
165 1.7 rillig /*
166 1.7 rillig * Even though this variable definition looks like a constant, it
167 1.7 rillig * does not fall within C's definition of an integer constant
168 1.7 rillig * expression. Due to that, lint does not perform constant folding
169 1.7 rillig * on the expression built from this variable and thus doesn't know
170 1.7 rillig * that the conversion will always succeed.
171 1.7 rillig */
172 1.7 rillig const int not_a_constant = 8;
173 1.8 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
174 1.8 rillig return not_a_constant * 8ULL;
175 1.7 rillig }
176 1.10 rillig
177 1.10 rillig /*
178 1.10 rillig * PR 36668 notices that lint wrongly complains about the possible loss.
179 1.11 rillig *
180 1.11 rillig * The expression 'u8_t << 8' is guaranteed to fit into an 'u16_t', and its
181 1.11 rillig * lower 8 bits are guaranteed to be clear. 'u16_t | u8_t' is guaranteed to
182 1.11 rillig * fit into 'u16_t'.
183 1.11 rillig *
184 1.11 rillig * Since tree.c 1.444 from 2022-05-26, lint tracks simple bitwise and
185 1.11 rillig * arithmetic constraints across a single expression.
186 1.10 rillig */
187 1.10 rillig static inline u16_t
188 1.10 rillig be16dec(const void *buf)
189 1.10 rillig {
190 1.10 rillig const u8_t *p = buf;
191 1.10 rillig
192 1.11 rillig /*
193 1.11 rillig * Before tree.c 1.444 from 2022-05-26, lint complained that the
194 1.11 rillig * conversion from 'int' to 'unsigned short' may lose accuracy.
195 1.11 rillig */
196 1.10 rillig return ((u16_t)p[0]) << 8 | p[1];
197 1.10 rillig }
198 1.10 rillig
199 1.10 rillig /*
200 1.10 rillig * Since tree.c 1.434 from 2022-04-19, lint infers the possible values of
201 1.10 rillig * expressions of the form 'integer & constant', see can_represent.
202 1.10 rillig */
203 1.10 rillig static inline void
204 1.10 rillig be32enc(void *buf, u32_t u)
205 1.10 rillig {
206 1.10 rillig u8_t *p = buf;
207 1.10 rillig
208 1.10 rillig p[0] = u >> 24 & 0xff;
209 1.10 rillig p[1] = u >> 16 & 0xff;
210 1.10 rillig p[2] = u >> 8 & 0xff;
211 1.10 rillig p[3] = u & 0xff;
212 1.10 rillig }
213 1.12 rillig
214 1.12 rillig u32_t
215 1.12 rillig test_ic_shr(u64_t x)
216 1.12 rillig {
217 1.12 rillig if (x > 3)
218 1.12 rillig return x >> 32;
219 1.12 rillig if (x > 2)
220 1.12 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
221 1.12 rillig return x >> 31;
222 1.12 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
223 1.12 rillig return x;
224 1.12 rillig }
225 1.14 rillig
226 1.14 rillig
227 1.14 rillig struct bit_fields {
228 1.14 rillig unsigned bits_32: 32;
229 1.14 rillig unsigned bits_5: 5;
230 1.14 rillig unsigned bits_3: 3;
231 1.14 rillig };
232 1.14 rillig
233 1.14 rillig unsigned char
234 1.17 rillig test_bit_fields(struct bit_fields s, unsigned long long m)
235 1.14 rillig {
236 1.17 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
237 1.14 rillig s.bits_3 = s.bits_32 & m;
238 1.14 rillig
239 1.14 rillig s.bits_5 = s.bits_3 & m;
240 1.14 rillig s.bits_32 = s.bits_5 & m;
241 1.14 rillig
242 1.17 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
243 1.14 rillig return s.bits_32 & m;
244 1.14 rillig }
245 1.20 rillig
246 1.20 rillig u64_t
247 1.20 rillig u64_shl(u64_t lhs, u64_t rhs)
248 1.20 rillig {
249 1.20 rillig return lhs << rhs;
250 1.20 rillig }
251 1.20 rillig
252 1.20 rillig u64_t
253 1.20 rillig u64_shr(u64_t lhs, u64_t rhs)
254 1.20 rillig {
255 1.20 rillig return lhs >> rhs;
256 1.20 rillig }
257 1.20 rillig
258 1.20 rillig s64_t
259 1.20 rillig s64_shl(s64_t lhs, s64_t rhs)
260 1.20 rillig {
261 1.20 rillig return lhs << rhs;
262 1.20 rillig }
263 1.20 rillig
264 1.20 rillig s64_t
265 1.20 rillig s64_shr(s64_t lhs, s64_t rhs)
266 1.20 rillig {
267 1.20 rillig return lhs >> rhs;
268 1.20 rillig }
269