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