msg_161.c revision 1.10
11.10Srillig/* $NetBSD: msg_161.c,v 1.10 2023/03/28 14:44:35 rillig Exp $ */ 21.1Srillig# 3 "msg_161.c" 31.1Srillig 41.1Srillig// Test for message: constant in conditional context [161] 51.1Srillig 61.10Srillig/* lint1-extra-flags: -h -X 351 */ 71.2Srillig 81.2Srilligvoid 91.2Srilligwhile_1(void) 101.2Srillig{ 111.9Srillig /* expect+1: warning: constant in conditional context [161] */ 121.9Srillig while (1) 131.2Srillig continue; 141.2Srillig} 151.2Srillig 161.2Srilligvoid 171.2Srilligwhile_0(void) 181.2Srillig{ 191.9Srillig /* expect+1: warning: constant in conditional context [161] */ 201.9Srillig while (0) { 211.9Srillig /* expect+1: warning: statement not reached [193] */ 221.9Srillig continue; 231.9Srillig } 241.2Srillig} 251.2Srillig 261.2Srillig/* 271.2Srillig * The pattern 'do { } while (0)' is a common technique to define a 281.2Srillig * preprocessor macro that behaves like a single statement. There is 291.2Srillig * nothing unusual or surprising about the constant condition. 301.4Srillig * Before tree.c 1.202 from 2021-01-31, lint warned about it. 311.2Srillig */ 321.2Srilligvoid 331.2Srilligdo_while_0(void) 341.2Srillig{ 351.2Srillig do { 361.2Srillig 371.4Srillig } while (0); 381.2Srillig} 391.2Srillig 401.2Srilligvoid 411.2Srilligdo_while_1(void) 421.2Srillig{ 431.2Srillig do { 441.9Srillig /* expect+1: warning: constant in conditional context [161] */ 451.9Srillig } while (1); 461.2Srillig} 471.5Srillig 481.5Srilligextern void println(const char *); 491.5Srillig 501.6Srillig/* 511.6Srillig * Since 2021-02-28, lint no longer warns about constant controlling 521.6Srillig * expressions involving sizeof since these are completely legitimate. 531.6Srillig */ 541.5Srilligvoid 551.5Srilligtest_sizeof(void) 561.5Srillig{ 571.6Srillig if (sizeof(int) > sizeof(char)) 581.5Srillig println("very probable"); 591.6Srillig if (sizeof(int) < sizeof(char)) 601.5Srillig println("impossible"); 611.5Srillig} 621.8Srillig 631.8Srilligconst _Bool conditions[] = { 641.8Srillig /* XXX: Why no warning here? */ 651.8Srillig 13 < 13, 661.8Srillig /* XXX: Why no warning here? */ 671.8Srillig 0 < 0, 681.8Srillig /* XXX: Why no warning here? */ 691.8Srillig 0 != 0, 701.8Srillig /* expect+1: warning: constant in conditional context [161] */ 711.8Srillig 0 == 0 && 1 == 0, 721.8Srillig /* expect+1: warning: constant in conditional context [161] */ 731.8Srillig 1 == 0 || 2 == 1, 741.8Srillig /* expect+2: warning: constant in conditional context [161] */ 751.8Srillig /* expect+1: error: non-constant initializer [177] */ 761.8Srillig 0 == 0 && ""[0] == '\0', 771.8Srillig /* expect+2: warning: constant in conditional context [161] */ 781.8Srillig /* expect+1: error: non-constant initializer [177] */ 791.8Srillig ""[0] == '\0' && 0 == 0, 801.8Srillig}; 81