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