1 /* $NetBSD: msg_129.c,v 1.3 2021/01/30 23:05:08 rillig Exp $ */ 2 # 3 "msg_129.c" 3 4 // Test for message: expression has null effect [129] 5 6 /* lint1-extra-flags: -h */ 7 8 typedef unsigned char uint8_t; 9 typedef unsigned int uint32_t; 10 11 _Bool side_effect(void); 12 13 /* 14 * Before tree.c 1.198 from 2021-01-30, the nested comma operators were 15 * wrongly reported as having no side effect. 16 * 17 * The bug was that has_side_effect did not properly examine the sub-nodes. 18 * The ',' operator has m_has_side_effect == false since it depends on its 19 * operands whether the ',' actually has side effects. For nested ',' 20 * operators, the function did not evaluate the operands deeply but only did 21 * a quick shallow test on the m_has_side_effect property. Since that is 22 * false, lint thought that the whole expression would have no side effect. 23 */ 24 void 25 uint8_buffer_write_uint32(uint8_t *c, uint32_t l) 26 { 27 (*(c++) = (uint8_t)(l & 0xff), 28 *(c++) = (uint8_t)((l >> 8L) & 0xff), 29 *(c++) = (uint8_t)((l >> 16L) & 0xff), 30 *(c++) = (uint8_t)((l >> 24L) & 0xff)); 31 } 32 33 void 34 operator_comma(void) 35 { 36 side_effect(), 0; /* the 0 is redundant */ 37 0, side_effect(); /* expect: 129 */ 38 39 if (side_effect(), 0) /* the 0 controls the 'if' */ 40 return; 41 if (0, side_effect()) /* expect: 129 */ 42 return; 43 } 44