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 8struct 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 33void 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