msg_161.c revision 1.8
11.8Srillig/* $NetBSD: msg_161.c,v 1.8 2022/04/16 20:57:10 rillig Exp $ */ 21.1Srillig# 3 "msg_161.c" 31.1Srillig 41.1Srillig// Test for message: constant in conditional context [161] 51.1Srillig 61.2Srillig/* lint1-extra-flags: -h */ 71.2Srillig 81.2Srilligvoid 91.2Srilligwhile_1(void) 101.2Srillig{ 111.3Srillig while (1) /* expect: 161 */ 121.2Srillig continue; 131.2Srillig} 141.2Srillig 151.2Srilligvoid 161.2Srilligwhile_0(void) 171.2Srillig{ 181.3Srillig while (0) /* expect: 161 */ 191.7Srillig continue; /* expect: statement not reached */ 201.2Srillig} 211.2Srillig 221.2Srillig/* 231.2Srillig * The pattern 'do { } while (0)' is a common technique to define a 241.2Srillig * preprocessor macro that behaves like a single statement. There is 251.2Srillig * nothing unusual or surprising about the constant condition. 261.4Srillig * Before tree.c 1.202 from 2021-01-31, lint warned about it. 271.2Srillig */ 281.2Srilligvoid 291.2Srilligdo_while_0(void) 301.2Srillig{ 311.2Srillig do { 321.2Srillig 331.4Srillig } while (0); 341.2Srillig} 351.2Srillig 361.2Srilligvoid 371.2Srilligdo_while_1(void) 381.2Srillig{ 391.2Srillig do { 401.2Srillig 411.3Srillig } while (1); /* expect: 161 */ 421.2Srillig} 431.5Srillig 441.5Srilligextern void println(const char *); 451.5Srillig 461.6Srillig/* 471.6Srillig * Since 2021-02-28, lint no longer warns about constant controlling 481.6Srillig * expressions involving sizeof since these are completely legitimate. 491.6Srillig */ 501.5Srilligvoid 511.5Srilligtest_sizeof(void) 521.5Srillig{ 531.6Srillig if (sizeof(int) > sizeof(char)) 541.5Srillig println("very probable"); 551.6Srillig if (sizeof(int) < sizeof(char)) 561.5Srillig println("impossible"); 571.5Srillig} 581.8Srillig 591.8Srilligconst _Bool conditions[] = { 601.8Srillig /* XXX: Why no warning here? */ 611.8Srillig 13 < 13, 621.8Srillig /* XXX: Why no warning here? */ 631.8Srillig 0 < 0, 641.8Srillig /* XXX: Why no warning here? */ 651.8Srillig 0 != 0, 661.8Srillig /* expect+1: warning: constant in conditional context [161] */ 671.8Srillig 0 == 0 && 1 == 0, 681.8Srillig /* expect+1: warning: constant in conditional context [161] */ 691.8Srillig 1 == 0 || 2 == 1, 701.8Srillig /* expect+2: warning: constant in conditional context [161] */ 711.8Srillig /* expect+1: error: non-constant initializer [177] */ 721.8Srillig 0 == 0 && ""[0] == '\0', 731.8Srillig /* expect+2: warning: constant in conditional context [161] */ 741.8Srillig /* expect+1: error: non-constant initializer [177] */ 751.8Srillig ""[0] == '\0' && 0 == 0, 761.8Srillig}; 77