Home | History | Annotate | Line # | Download | only in lint1
      1 /*	$NetBSD: msg_166.c,v 1.6 2024/06/08 06:37:06 rillig Exp $	*/
      2 # 3 "msg_166.c"
      3 
      4 // Test for message: precision lost in bit-field assignment [166]
      5 
      6 /* lint1-extra-flags: -hp -X 351 */
      7 
      8 struct bit_set {
      9 
     10 	/*
     11 	 * C99 6.7.2p5 and 6.7.2.1p9 footnote 104 say that for bit-fields of
     12 	 * underlying type 'int', "it is implementation-defined whether the
     13 	 * specifier 'int' designates the same type as 'signed int' or the
     14 	 * same type as 'unsigned int'".
     15 	 *
     16 	 * https://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations
     17 	 * -and-bit-fields-implementation.html says: "By default it is treated
     18 	 * as 'signed int' but this may be changed by the
     19 	 * '-funsigned-bitfields' option".
     20 	 *
     21 	 * Clang doesn't document implementation-defined behavior, see
     22 	 * https://bugs.llvm.org/show_bug.cgi?id=11272.
     23 	 */
     24 
     25 	/* expect+1: warning: bit-field of type plain 'int' has implementation-defined signedness [344] */
     26 	int minus_1_to_0: 1;
     27 	/* expect+1: warning: bit-field of type plain 'int' has implementation-defined signedness [344] */
     28 	int minus_8_to_7: 4;
     29 	unsigned zero_to_1: 1;
     30 	unsigned zero_to_15: 4;
     31 };
     32 
     33 void example(void) {
     34 	struct bit_set bits;
     35 
     36 	/* Clang doesn't warn about the 1. */
     37 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     38 	bits.minus_1_to_0 = -2;
     39 	bits.minus_1_to_0 = -1;
     40 	bits.minus_1_to_0 = 0;
     41 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     42 	bits.minus_1_to_0 = 1;
     43 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     44 	bits.minus_1_to_0 = 2;
     45 
     46 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     47 	bits.minus_8_to_7 = -9;
     48 	bits.minus_8_to_7 = -8;
     49 	bits.minus_8_to_7 = 7;
     50 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     51 	bits.minus_8_to_7 = 8;
     52 
     53 	/* Clang doesn't warn about the -1. */
     54 	/* expect+1: warning: assignment of negative constant -2 to unsigned type 'unsigned int:1' [164] */
     55 	bits.zero_to_1 = -2;
     56 	/* expect+1: warning: assignment of negative constant -1 to unsigned type 'unsigned int:1' [164] */
     57 	bits.zero_to_1 = -1;
     58 	bits.zero_to_1 = 0;
     59 	bits.zero_to_1 = 1;
     60 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     61 	bits.zero_to_1 = 2;
     62 
     63 	/* Clang doesn't warn about the -8. */
     64 	/* expect+1: warning: assignment of negative constant -9 to unsigned type 'unsigned int:4' [164] */
     65 	bits.zero_to_15 = -9;
     66 	/* expect+1: warning: assignment of negative constant -8 to unsigned type 'unsigned int:4' [164] */
     67 	bits.zero_to_15 = -8;
     68 	bits.zero_to_15 = 0;
     69 	bits.zero_to_15 = 15;
     70 	/* expect+1: warning: precision lost in bit-field assignment [166] */
     71 	bits.zero_to_15 = 16;
     72 }
     73