msg_132.c revision 1.8 1 1.8 rillig /* $NetBSD: msg_132.c,v 1.8 2022/04/20 22:50:56 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.3 rillig * conversions, -aa 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.3 rillig typedef unsigned char u8;
17 1.3 rillig typedef unsigned short u16;
18 1.3 rillig typedef unsigned int u32;
19 1.3 rillig typedef unsigned long long u64;
20 1.3 rillig
21 1.3 rillig typedef signed char i8;
22 1.3 rillig typedef signed short i16;
23 1.3 rillig typedef signed int i32;
24 1.3 rillig typedef signed long long i64;
25 1.3 rillig
26 1.3 rillig void
27 1.3 rillig convert_unsigned(u8 v8, u16 v16, u32 v32, u64 v64)
28 1.3 rillig {
29 1.3 rillig v8 = v16; /* expect: 132 */
30 1.3 rillig v8 = v32; /* expect: 132 */
31 1.3 rillig v8 = v64; /* expect: 132 */
32 1.3 rillig
33 1.3 rillig v16 = v8;
34 1.3 rillig v16 = v32; /* expect: 132 */
35 1.3 rillig v16 = v64; /* expect: 132 */
36 1.3 rillig
37 1.3 rillig v32 = v8;
38 1.3 rillig v32 = v16;
39 1.3 rillig v32 = v64; /* expect: 132 */
40 1.3 rillig
41 1.3 rillig v64 = v8;
42 1.3 rillig v64 = v16;
43 1.3 rillig v64 = v32;
44 1.3 rillig }
45 1.3 rillig
46 1.3 rillig void
47 1.3 rillig convert_signed(i8 v8, i16 v16, i32 v32, i64 v64)
48 1.3 rillig {
49 1.3 rillig v8 = v16; /* expect: 132 */
50 1.3 rillig v8 = v32; /* expect: 132 */
51 1.3 rillig v8 = v64; /* expect: 132 */
52 1.3 rillig
53 1.3 rillig v16 = v8;
54 1.3 rillig v16 = v32; /* expect: 132 */
55 1.3 rillig v16 = v64; /* expect: 132 */
56 1.3 rillig
57 1.3 rillig v32 = v8;
58 1.3 rillig v32 = v16;
59 1.3 rillig v32 = v64; /* expect: 132 */
60 1.3 rillig
61 1.3 rillig v64 = v8;
62 1.3 rillig v64 = v16;
63 1.3 rillig v64 = v32;
64 1.3 rillig }
65 1.4 rillig
66 1.5 rillig /*
67 1.5 rillig * Before tree.c 1.268 from 2021-04-06, lint wrongly warned that conversion to
68 1.5 rillig * _Bool might lose accuracy. C99 6.3.1.2 defines a special conversion rule
69 1.5 rillig * from scalar to _Bool though.
70 1.5 rillig */
71 1.4 rillig _Bool
72 1.4 rillig to_bool(long a, long b)
73 1.4 rillig {
74 1.4 rillig /* seen in fp_lib.h, function wideRightShiftWithSticky */
75 1.5 rillig return a | b;
76 1.4 rillig }
77 1.6 rillig
78 1.6 rillig /* ARGSUSED */
79 1.6 rillig const char *
80 1.6 rillig cover_build_plus_minus(const char *arr, double idx)
81 1.6 rillig {
82 1.6 rillig /* expect+3: error: operands of '+' have incompatible types (pointer != double) [107] */
83 1.6 rillig /* expect+2: warning: function 'cover_build_plus_minus' expects to return value [214] */
84 1.6 rillig if (idx > 0.0)
85 1.6 rillig return arr + idx;
86 1.6 rillig return arr + (unsigned int)idx;
87 1.6 rillig }
88 1.7 rillig
89 1.7 rillig int
90 1.7 rillig non_constant_expression(void)
91 1.7 rillig {
92 1.7 rillig /*
93 1.7 rillig * Even though this variable definition looks like a constant, it
94 1.7 rillig * does not fall within C's definition of an integer constant
95 1.7 rillig * expression. Due to that, lint does not perform constant folding
96 1.7 rillig * on the expression built from this variable and thus doesn't know
97 1.7 rillig * that the conversion will always succeed.
98 1.7 rillig */
99 1.7 rillig const int not_a_constant = 8;
100 1.8 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
101 1.8 rillig return not_a_constant * 8ULL;
102 1.7 rillig }
103