Home | History | Annotate | Line # | Download | only in lint1
msg_132.c revision 1.9
      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