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