1 /* $NetBSD: msg_267.c,v 1.8 2024/03/12 07:56:08 rillig Exp $ */ 2 # 3 "msg_267.c" 3 4 // Test for message: shift amount %u equals bit-size of '%s' [267] 5 6 /* lint1-extra-flags: -X 351 */ 7 8 int 9 shr32(unsigned int x) 10 { 11 /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */ 12 return x >> 32; 13 } 14 15 int 16 shl32(unsigned int x) 17 { 18 /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */ 19 return x << 32; 20 } 21 22 /* 23 * As of 2022-08-19, lint ignores the GCC-specific 'mode' attribute, treating 24 * the tetra-int as a plain single-int, thus having width 32. 25 * 26 * https://gcc.gnu.org/onlinedocs/gccint/Machine-Modes.html 27 */ 28 unsigned 29 function(unsigned __attribute__((mode(TI))) arg) 30 { 31 /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */ 32 return (arg >> 32) & 3; 33 } 34 35 unsigned 36 shift_bit_field(void) 37 { 38 struct { 39 unsigned bit_field:18; 40 } s = { 12345 }; 41 42 /* 43 * A warning may be useful here for '>>' with a shift amount >= 18. 44 * 45 * For '<<' and bit-size <= 31, a warning only makes sense for shift 46 * amounts >= 31, as it is legitimate to rely on the default integer 47 * promotions of the left-hand operand. The default integer promotion 48 * turns the type into 'int', not 'unsigned int', therefore the 31. 49 * Using the same warning text would be confusing though. 50 * 51 * For '<<' and bit-size == 32, the standard case applies. 52 * 53 * As of 2022-08-19, Clang-tidy doesn't warn about any of these. 54 */ 55 return 56 (s.bit_field >> 17) & 57 (s.bit_field >> 18) & 58 (s.bit_field >> 19) & 59 (s.bit_field >> 31) & 60 // When promoting 'unsigned int:18', the target type is 'int', as 61 // it can represent all possible values; this is a bit misleading 62 // as its sign bit is always 0. 63 /* expect+1: warning: shift amount 32 equals bit-size of 'int:19' [267] */ 64 (s.bit_field >> 32) & 65 // When promoting 'unsigned int:18', the target type is 'int', as 66 // it can represent all possible values; this is a bit misleading 67 // as its sign bit is always 0. 68 /* expect+1: warning: shift amount 33 is greater than bit-size 32 of 'int' [122] */ 69 (s.bit_field >> 33) & 70 (s.bit_field << 17) & 71 (s.bit_field << 18) & 72 (s.bit_field << 19) & 73 (s.bit_field << 31) & 74 // When promoting 'unsigned int:18', the target type is 'int', as 75 // it can represent all possible values; this is a bit misleading 76 // as its sign bit is always 0. 77 /* expect+1: warning: shift amount 32 equals bit-size of 'int:19' [267] */ 78 (s.bit_field << 32) & 79 // When promoting 'unsigned int:18', the target type is 'int', as 80 // it can represent all possible values; this is a bit misleading 81 // as its sign bit is always 0. 82 /* expect+1: warning: shift amount 33 is greater than bit-size 32 of 'int' [122] */ 83 (s.bit_field << 33) & 84 15; 85 } 86