msg_161.c revision 1.13
11.13Srillig/* $NetBSD: msg_161.c,v 1.13 2025/04/06 20:56:14 rillig Exp $ */ 21.1Srillig# 3 "msg_161.c" 31.1Srillig 41.1Srillig// Test for message: constant in conditional context [161] 51.13Srillig// This message is not used. There is no evidence that it detects real bugs, 61.13Srillig// instead it produces noise for perfectly valid code. 71.1Srillig 81.10Srillig/* lint1-extra-flags: -h -X 351 */ 91.2Srillig 101.2Srilligvoid 111.2Srilligwhile_1(void) 121.2Srillig{ 131.13Srillig /* was: warning: constant in conditional context [161] */ 141.9Srillig while (1) 151.2Srillig continue; 161.2Srillig} 171.2Srillig 181.2Srilligvoid 191.2Srilligwhile_0(void) 201.2Srillig{ 211.13Srillig /* was: warning: constant in conditional context [161] */ 221.9Srillig while (0) { 231.12Srillig /* expect+1: warning: 'continue' statement not reached [193] */ 241.9Srillig continue; 251.9Srillig } 261.2Srillig} 271.2Srillig 281.2Srillig/* 291.2Srillig * The pattern 'do { } while (0)' is a common technique to define a 301.2Srillig * preprocessor macro that behaves like a single statement. There is 311.2Srillig * nothing unusual or surprising about the constant condition. 321.4Srillig * Before tree.c 1.202 from 2021-01-31, lint warned about it. 331.2Srillig */ 341.2Srilligvoid 351.2Srilligdo_while_0(void) 361.2Srillig{ 371.2Srillig do { 381.2Srillig 391.4Srillig } while (0); 401.2Srillig} 411.2Srillig 421.2Srilligvoid 431.2Srilligdo_while_1(void) 441.2Srillig{ 451.2Srillig do { 461.13Srillig /* was: warning: constant in conditional context [161] */ 471.9Srillig } while (1); 481.2Srillig} 491.5Srillig 501.5Srilligextern void println(const char *); 511.5Srillig 521.6Srillig/* 531.6Srillig * Since 2021-02-28, lint no longer warns about constant controlling 541.6Srillig * expressions involving sizeof since these are completely legitimate. 551.6Srillig */ 561.5Srilligvoid 571.5Srilligtest_sizeof(void) 581.5Srillig{ 591.6Srillig if (sizeof(int) > sizeof(char)) 601.5Srillig println("very probable"); 611.6Srillig if (sizeof(int) < sizeof(char)) 621.5Srillig println("impossible"); 631.5Srillig} 641.8Srillig 651.8Srilligconst _Bool conditions[] = { 661.8Srillig /* XXX: Why no warning here? */ 671.8Srillig 13 < 13, 681.8Srillig /* XXX: Why no warning here? */ 691.8Srillig 0 < 0, 701.8Srillig /* XXX: Why no warning here? */ 711.8Srillig 0 != 0, 721.13Srillig /* was: warning: constant in conditional context [161] */ 731.8Srillig 0 == 0 && 1 == 0, 741.13Srillig /* was: warning: constant in conditional context [161] */ 751.8Srillig 1 == 0 || 2 == 1, 761.13Srillig /* was: warning: constant in conditional context [161] */ 771.8Srillig /* expect+1: error: non-constant initializer [177] */ 781.8Srillig 0 == 0 && ""[0] == '\0', 791.13Srillig /* was: warning: constant in conditional context [161] */ 801.8Srillig /* expect+1: error: non-constant initializer [177] */ 811.8Srillig ""[0] == '\0' && 0 == 0, 821.11Srillig /* C99 6.6p3: Constant expressions shall not contain [...] comma */ 831.11Srillig /* expect+2: warning: expression has null effect [129] */ 841.11Srillig /* expect+1: error: non-constant initializer [177] */ 851.11Srillig (0 == 0, 1 == 0), 861.8Srillig}; 87