1 1.9 rillig /* $NetBSD: msg_117.c,v 1.9 2021/08/27 17:59:46 rillig Exp $ */ 2 1.1 rillig # 3 "msg_117.c" 3 1.1 rillig 4 1.4 rillig // Test for message: bitwise '%s' on signed value possibly nonportable [117] 5 1.1 rillig 6 1.2 rillig /* lint1-extra-flags: -p */ 7 1.2 rillig 8 1.2 rillig int 9 1.2 rillig shr(int a, int b) 10 1.2 rillig { 11 1.3 rillig return a >> b; /* expect: 117 */ 12 1.2 rillig } 13 1.2 rillig 14 1.2 rillig int 15 1.2 rillig shr_lhs_constant_positive(int a) 16 1.2 rillig { 17 1.2 rillig return 0x1234 >> a; 18 1.2 rillig } 19 1.2 rillig 20 1.2 rillig int 21 1.2 rillig shr_lhs_constant_negative(int a) 22 1.2 rillig { 23 1.3 rillig return -0x1234 >> a; /* expect: 120 */ 24 1.2 rillig } 25 1.2 rillig 26 1.2 rillig int 27 1.2 rillig shr_rhs_constant_positive(int a) 28 1.2 rillig { 29 1.5 rillig return a >> 0x1234; /* expect: 117 *//* expect: 122 */ 30 1.2 rillig } 31 1.2 rillig 32 1.2 rillig int 33 1.2 rillig shr_rhs_constant_negative(int a) 34 1.2 rillig { 35 1.5 rillig return a >> -0x1234; /* expect: 117 *//* expect: 121 */ 36 1.2 rillig } 37 1.6 rillig 38 1.6 rillig unsigned int 39 1.6 rillig shr_unsigned_char(unsigned char uc) 40 1.6 rillig { 41 1.7 rillig /* 42 1.7 rillig * Even though 'uc' is promoted to 'int', it cannot be negative. 43 1.7 rillig * Before tree.c 1.335 from 2021-08-15, lint wrongly warned that 44 1.7 rillig * 'uc >> 4' might be a bitwise '>>' on signed value. 45 1.7 rillig */ 46 1.6 rillig return uc >> 4; 47 1.6 rillig } 48 1.8 rillig 49 1.8 rillig unsigned char 50 1.9 rillig shr_unsigned_char_promoted_signed(unsigned char bit) 51 1.8 rillig { 52 1.8 rillig /* 53 1.9 rillig * The possible values for 'bit' range from 0 to 255. Subtracting 1 54 1.9 rillig * from 0 results in a negative expression value. 55 1.8 rillig */ 56 1.8 rillig /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */ 57 1.8 rillig return (unsigned char)((bit - 1) >> 5); 58 1.8 rillig } 59 1.9 rillig 60 1.9 rillig unsigned char 61 1.9 rillig shr_unsigned_char_promoted_unsigned(unsigned char bit) 62 1.9 rillig { 63 1.9 rillig /* 64 1.9 rillig * To prevent the above warning, the intermediate expression must be 65 1.9 rillig * cast to 'unsigned char'. 66 1.9 rillig */ 67 1.9 rillig return (unsigned char)((unsigned char)(bit - 1) >> 5); 68 1.9 rillig } 69