Home | History | Annotate | Line # | Download | only in lint1
msg_132_ilp32.c revision 1.5
      1 /*	$NetBSD: msg_132_ilp32.c,v 1.5 2023/08/08 20:15:11 rillig Exp $	*/
      2 # 3 "msg_132_ilp32.c"
      3 
      4 // Test for message: conversion from '%s' to '%s' may lose accuracy [132]
      5 
      6 /*
      7  * On 32-bit platforms, it is possible to add a 64-bit integer to a 32-bit
      8  * pointer.  The 64-bit integer is then converted to the ptrdiff_t of the
      9  * target platform, which results in the non-obvious conversion from
     10  * 'long long' to either 'long' or 'int', depending on the platform's
     11  * ptrdiff_t.
     12  */
     13 
     14 /* lint1-only-if: ilp32 int */
     15 /* lint1-extra-flags: -a -X 351 */
     16 
     17 /*
     18  * Seen in usr.bin/make/var.c, function RegexReplace, in the function call
     19  * SepBuf_AddBytesBetween(buf, wp + m[0].rm_so, wp + m[0].rm_eo).  The
     20  * offsets of regular expression matches have type off_t, which is a 64-bit
     21  * integer.
     22  *
     23  * C11 6.5.6p8 does not explicitly define the meaning of a pointer + an
     24  * overly long integer, it just says "undefined behavior" if the resulting
     25  * pointer would be outside the object.
     26  */
     27 const char *
     28 array_subscript(const char *p, long long idx)
     29 {
     30 	/* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
     31 	return p + idx;
     32 }
     33 
     34 /*
     35  * On ILP32 platforms, pointer, long and int have the same size, so there is
     36  * no loss of accuracy.
     37  */
     38 unsigned int
     39 convert_pointer_to_smaller_integer(void *ptr)
     40 {
     41 	return (unsigned long)(ptr) >> 12;
     42 }
     43 
     44 _Bool bool_var;
     45 char char_var;
     46 signed char schar_var;
     47 unsigned char uchar_var;
     48 short short_var;
     49 unsigned short ushort_var;
     50 int int_var;
     51 unsigned int uint_var;
     52 long long_var;
     53 unsigned long ulong_var;
     54 long long llong_var;
     55 unsigned long long ullong_var;
     56 
     57 void
     58 convert_all(void)
     59 {
     60 	bool_var = bool_var;
     61 	bool_var = char_var;
     62 	bool_var = schar_var;
     63 	bool_var = uchar_var;
     64 	bool_var = short_var;
     65 	bool_var = ushort_var;
     66 	bool_var = int_var;
     67 	bool_var = uint_var;
     68 	bool_var = long_var;
     69 	bool_var = ulong_var;
     70 	bool_var = llong_var;
     71 	bool_var = ullong_var;
     72 
     73 	char_var = bool_var;
     74 	char_var = char_var;
     75 	char_var = schar_var;
     76 	char_var = uchar_var;
     77 	char_var = short_var;
     78 	char_var = ushort_var;
     79 	char_var = int_var;
     80 	char_var = uint_var;
     81 	/* expect+1: warning: conversion from 'long' to 'char' may lose accuracy [132] */
     82 	char_var = long_var;
     83 	/* expect+1: warning: conversion from 'unsigned long' to 'char' may lose accuracy [132] */
     84 	char_var = ulong_var;
     85 	/* expect+1: warning: conversion from 'long long' to 'char' may lose accuracy [132] */
     86 	char_var = llong_var;
     87 	/* expect+1: warning: conversion from 'unsigned long long' to 'char' may lose accuracy [132] */
     88 	char_var = ullong_var;
     89 
     90 	schar_var = bool_var;
     91 	schar_var = char_var;
     92 	schar_var = schar_var;
     93 	schar_var = uchar_var;
     94 	schar_var = short_var;
     95 	schar_var = ushort_var;
     96 	schar_var = int_var;
     97 	schar_var = uint_var;
     98 	/* expect+1: warning: conversion from 'long' to 'signed char' may lose accuracy [132] */
     99 	schar_var = long_var;
    100 	/* expect+1: warning: conversion from 'unsigned long' to 'signed char' may lose accuracy [132] */
    101 	schar_var = ulong_var;
    102 	/* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
    103 	schar_var = llong_var;
    104 	/* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
    105 	schar_var = ullong_var;
    106 
    107 	uchar_var = bool_var;
    108 	uchar_var = char_var;
    109 	uchar_var = schar_var;
    110 	uchar_var = uchar_var;
    111 	uchar_var = short_var;
    112 	uchar_var = ushort_var;
    113 	uchar_var = int_var;
    114 	uchar_var = uint_var;
    115 	/* expect+1: warning: conversion from 'long' to 'unsigned char' may lose accuracy [132] */
    116 	uchar_var = long_var;
    117 	/* expect+1: warning: conversion from 'unsigned long' to 'unsigned char' may lose accuracy [132] */
    118 	uchar_var = ulong_var;
    119 	/* expect+1: warning: conversion from 'long long' to 'unsigned char' may lose accuracy [132] */
    120 	uchar_var = llong_var;
    121 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
    122 	uchar_var = ullong_var;
    123 
    124 	short_var = bool_var;
    125 	short_var = char_var;
    126 	short_var = schar_var;
    127 	short_var = uchar_var;
    128 	short_var = short_var;
    129 	short_var = ushort_var;
    130 	short_var = int_var;
    131 	short_var = uint_var;
    132 	/* expect+1: warning: conversion from 'long' to 'short' may lose accuracy [132] */
    133 	short_var = long_var;
    134 	/* expect+1: warning: conversion from 'unsigned long' to 'short' may lose accuracy [132] */
    135 	short_var = ulong_var;
    136 	/* expect+1: warning: conversion from 'long long' to 'short' may lose accuracy [132] */
    137 	short_var = llong_var;
    138 	/* expect+1: warning: conversion from 'unsigned long long' to 'short' may lose accuracy [132] */
    139 	short_var = ullong_var;
    140 
    141 	ushort_var = bool_var;
    142 	ushort_var = char_var;
    143 	ushort_var = schar_var;
    144 	ushort_var = uchar_var;
    145 	ushort_var = short_var;
    146 	ushort_var = ushort_var;
    147 	ushort_var = int_var;
    148 	ushort_var = uint_var;
    149 	/* expect+1: warning: conversion from 'long' to 'unsigned short' may lose accuracy [132] */
    150 	ushort_var = long_var;
    151 	/* expect+1: warning: conversion from 'unsigned long' to 'unsigned short' may lose accuracy [132] */
    152 	ushort_var = ulong_var;
    153 	/* expect+1: warning: conversion from 'long long' to 'unsigned short' may lose accuracy [132] */
    154 	ushort_var = llong_var;
    155 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned short' may lose accuracy [132] */
    156 	ushort_var = ullong_var;
    157 
    158 	int_var = bool_var;
    159 	int_var = char_var;
    160 	int_var = schar_var;
    161 	int_var = uchar_var;
    162 	int_var = short_var;
    163 	int_var = ushort_var;
    164 	int_var = int_var;
    165 	int_var = uint_var;
    166 	int_var = long_var;
    167 	int_var = ulong_var;
    168 	/* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy [132] */
    169 	int_var = llong_var;
    170 	/* expect+1: warning: conversion from 'unsigned long long' to 'int' may lose accuracy [132] */
    171 	int_var = ullong_var;
    172 
    173 	uint_var = bool_var;
    174 	uint_var = char_var;
    175 	uint_var = schar_var;
    176 	uint_var = uchar_var;
    177 	uint_var = short_var;
    178 	uint_var = ushort_var;
    179 	uint_var = int_var;
    180 	uint_var = uint_var;
    181 	uint_var = long_var;
    182 	uint_var = ulong_var;
    183 	/* expect+1: warning: conversion from 'long long' to 'unsigned int' may lose accuracy [132] */
    184 	uint_var = llong_var;
    185 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
    186 	uint_var = ullong_var;
    187 
    188 	long_var = bool_var;
    189 	long_var = char_var;
    190 	long_var = schar_var;
    191 	long_var = uchar_var;
    192 	long_var = short_var;
    193 	long_var = ushort_var;
    194 	long_var = int_var;
    195 	long_var = uint_var;
    196 	long_var = long_var;
    197 	long_var = ulong_var;
    198 	/* expect+1: warning: conversion from 'long long' to 'long' may lose accuracy [132] */
    199 	long_var = llong_var;
    200 	/* expect+1: warning: conversion from 'unsigned long long' to 'long' may lose accuracy [132] */
    201 	long_var = ullong_var;
    202 
    203 	ulong_var = bool_var;
    204 	ulong_var = char_var;
    205 	ulong_var = schar_var;
    206 	ulong_var = uchar_var;
    207 	ulong_var = short_var;
    208 	ulong_var = ushort_var;
    209 	ulong_var = int_var;
    210 	ulong_var = uint_var;
    211 	ulong_var = long_var;
    212 	ulong_var = ulong_var;
    213 	/* expect+1: warning: conversion from 'long long' to 'unsigned long' may lose accuracy [132] */
    214 	ulong_var = llong_var;
    215 	/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned long' may lose accuracy [132] */
    216 	ulong_var = ullong_var;
    217 
    218 	llong_var = bool_var;
    219 	llong_var = char_var;
    220 	llong_var = schar_var;
    221 	llong_var = uchar_var;
    222 	llong_var = short_var;
    223 	llong_var = ushort_var;
    224 	llong_var = int_var;
    225 	llong_var = uint_var;
    226 	llong_var = long_var;
    227 	llong_var = ulong_var;
    228 	llong_var = llong_var;
    229 	llong_var = ullong_var;
    230 
    231 	ullong_var = bool_var;
    232 	ullong_var = char_var;
    233 	ullong_var = schar_var;
    234 	ullong_var = uchar_var;
    235 	ullong_var = short_var;
    236 	ullong_var = ushort_var;
    237 	ullong_var = int_var;
    238 	ullong_var = uint_var;
    239 	ullong_var = long_var;
    240 	ullong_var = ulong_var;
    241 	ullong_var = llong_var;
    242 	ullong_var = ullong_var;
    243 }
    244