msg_132.c revision 1.10 1 1.10 rillig /* $NetBSD: msg_132.c,v 1.10 2022/05/26 07:03:03 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.9 rillig unsigned char u8;
17 1.9 rillig unsigned short u16;
18 1.9 rillig unsigned int u32;
19 1.9 rillig unsigned long long u64;
20 1.9 rillig
21 1.9 rillig signed char s8;
22 1.9 rillig signed short s16;
23 1.9 rillig signed int s32;
24 1.9 rillig signed long long s64;
25 1.3 rillig
26 1.3 rillig void
27 1.9 rillig unsigned_to_unsigned(void)
28 1.3 rillig {
29 1.9 rillig u8 = u16; /* expect: 132 */
30 1.9 rillig u8 = u32; /* expect: 132 */
31 1.9 rillig u8 = u64; /* expect: 132 */
32 1.9 rillig
33 1.9 rillig u16 = u8;
34 1.9 rillig u16 = u32; /* expect: 132 */
35 1.9 rillig u16 = u64; /* expect: 132 */
36 1.9 rillig
37 1.9 rillig u32 = u8;
38 1.9 rillig u32 = u16;
39 1.9 rillig u32 = u64; /* expect: 132 */
40 1.9 rillig
41 1.9 rillig u64 = u8;
42 1.9 rillig u64 = u16;
43 1.9 rillig u64 = u32;
44 1.3 rillig }
45 1.3 rillig
46 1.3 rillig void
47 1.9 rillig unsigned_to_signed(void)
48 1.3 rillig {
49 1.9 rillig s8 = u16; /* expect: 132 */
50 1.9 rillig s8 = u32; /* expect: 132 */
51 1.9 rillig s8 = u64; /* expect: 132 */
52 1.9 rillig
53 1.9 rillig s16 = u8;
54 1.9 rillig s16 = u32; /* expect: 132 */
55 1.9 rillig s16 = u64; /* expect: 132 */
56 1.9 rillig
57 1.9 rillig s32 = u8;
58 1.9 rillig s32 = u16;
59 1.9 rillig s32 = u64; /* expect: 132 */
60 1.9 rillig
61 1.9 rillig s64 = u8;
62 1.9 rillig s64 = u16;
63 1.9 rillig s64 = u32;
64 1.9 rillig }
65 1.9 rillig
66 1.9 rillig void
67 1.9 rillig signed_to_unsigned(void)
68 1.9 rillig {
69 1.9 rillig u8 = s16; /* expect: 132 */
70 1.9 rillig u8 = s32; /* expect: 132 */
71 1.9 rillig u8 = s64; /* expect: 132 */
72 1.9 rillig
73 1.9 rillig u16 = s8;
74 1.9 rillig u16 = s32; /* expect: 132 */
75 1.9 rillig u16 = s64; /* expect: 132 */
76 1.9 rillig
77 1.9 rillig u32 = s8;
78 1.9 rillig u32 = s16;
79 1.9 rillig u32 = s64; /* expect: 132 */
80 1.9 rillig
81 1.9 rillig u64 = s8;
82 1.9 rillig u64 = s16;
83 1.9 rillig u64 = s32;
84 1.9 rillig }
85 1.9 rillig
86 1.9 rillig void
87 1.9 rillig signed_to_signed(void)
88 1.9 rillig {
89 1.9 rillig s8 = s16; /* expect: 132 */
90 1.9 rillig s8 = s32; /* expect: 132 */
91 1.9 rillig s8 = s64; /* expect: 132 */
92 1.9 rillig
93 1.9 rillig s16 = s8;
94 1.9 rillig s16 = s32; /* expect: 132 */
95 1.9 rillig s16 = s64; /* expect: 132 */
96 1.9 rillig
97 1.9 rillig s32 = s8;
98 1.9 rillig s32 = s16;
99 1.9 rillig s32 = s64; /* expect: 132 */
100 1.9 rillig
101 1.9 rillig s64 = s8;
102 1.9 rillig s64 = s16;
103 1.9 rillig s64 = s32;
104 1.3 rillig }
105 1.4 rillig
106 1.5 rillig /*
107 1.9 rillig * Before tree.c 1.268 from 2021-04-06, lint wrongly warned that conversion
108 1.9 rillig * to _Bool might lose accuracy. C99 6.3.1.2 defines a special conversion
109 1.9 rillig * rule from scalar to _Bool though by comparing the value to 0.
110 1.5 rillig */
111 1.4 rillig _Bool
112 1.4 rillig to_bool(long a, long b)
113 1.4 rillig {
114 1.4 rillig /* seen in fp_lib.h, function wideRightShiftWithSticky */
115 1.5 rillig return a | b;
116 1.4 rillig }
117 1.6 rillig
118 1.6 rillig /* ARGSUSED */
119 1.6 rillig const char *
120 1.6 rillig cover_build_plus_minus(const char *arr, double idx)
121 1.6 rillig {
122 1.6 rillig /* expect+3: error: operands of '+' have incompatible types (pointer != double) [107] */
123 1.6 rillig /* expect+2: warning: function 'cover_build_plus_minus' expects to return value [214] */
124 1.6 rillig if (idx > 0.0)
125 1.6 rillig return arr + idx;
126 1.6 rillig return arr + (unsigned int)idx;
127 1.6 rillig }
128 1.7 rillig
129 1.7 rillig int
130 1.7 rillig non_constant_expression(void)
131 1.7 rillig {
132 1.7 rillig /*
133 1.7 rillig * Even though this variable definition looks like a constant, it
134 1.7 rillig * does not fall within C's definition of an integer constant
135 1.7 rillig * expression. Due to that, lint does not perform constant folding
136 1.7 rillig * on the expression built from this variable and thus doesn't know
137 1.7 rillig * that the conversion will always succeed.
138 1.7 rillig */
139 1.7 rillig const int not_a_constant = 8;
140 1.8 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
141 1.8 rillig return not_a_constant * 8ULL;
142 1.7 rillig }
143 1.10 rillig
144 1.10 rillig typedef unsigned char u8_t;
145 1.10 rillig typedef unsigned short u16_t;
146 1.10 rillig typedef unsigned int u32_t;
147 1.10 rillig typedef unsigned long long u64_t;
148 1.10 rillig
149 1.10 rillig /*
150 1.10 rillig * PR 36668 notices that lint wrongly complains about the possible loss.
151 1.10 rillig * The expression 'uint8_t << 8' is guaranteed to fit into an 'unsigned short'.
152 1.10 rillig * 'unsigned short | unsigned char' is guaranteed to fit into 'unsigned short'
153 1.10 rillig */
154 1.10 rillig static inline u16_t
155 1.10 rillig be16dec(const void *buf)
156 1.10 rillig {
157 1.10 rillig const u8_t *p = buf;
158 1.10 rillig
159 1.10 rillig /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
160 1.10 rillig return ((u16_t)p[0]) << 8 | p[1];
161 1.10 rillig }
162 1.10 rillig
163 1.10 rillig /*
164 1.10 rillig * Since tree.c 1.434 from 2022-04-19, lint infers the possible values of
165 1.10 rillig * expressions of the form 'integer & constant', see can_represent.
166 1.10 rillig */
167 1.10 rillig static inline void
168 1.10 rillig be32enc(void *buf, u32_t u)
169 1.10 rillig {
170 1.10 rillig u8_t *p = buf;
171 1.10 rillig
172 1.10 rillig p[0] = u >> 24 & 0xff;
173 1.10 rillig p[1] = u >> 16 & 0xff;
174 1.10 rillig p[2] = u >> 8 & 0xff;
175 1.10 rillig p[3] = u & 0xff;
176 1.10 rillig }
177