1 1.9 rillig /* $NetBSD: msg_132.c,v 1.9 2022/04/21 19: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.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