1*6937eff3Srillig /* $NetBSD: msg_161.c,v 1.12 2024/11/13 04:32:49 rillig Exp $ */ 2a0a15c14Srillig # 3 "msg_161.c" 3a0a15c14Srillig 4a0a15c14Srillig // Test for message: constant in conditional context [161] 5a0a15c14Srillig 6b2baa501Srillig /* lint1-extra-flags: -h -X 351 */ 7bed82d19Srillig 8bed82d19Srillig void 9bed82d19Srillig while_1(void) 10bed82d19Srillig { 1165e5c21bSrillig /* expect+1: warning: constant in conditional context [161] */ 1265e5c21bSrillig while (1) 13bed82d19Srillig continue; 14bed82d19Srillig } 15bed82d19Srillig 16bed82d19Srillig void 17bed82d19Srillig while_0(void) 18bed82d19Srillig { 1965e5c21bSrillig /* expect+1: warning: constant in conditional context [161] */ 2065e5c21bSrillig while (0) { 21*6937eff3Srillig /* expect+1: warning: 'continue' statement not reached [193] */ 2265e5c21bSrillig continue; 2365e5c21bSrillig } 24bed82d19Srillig } 25bed82d19Srillig 26bed82d19Srillig /* 27bed82d19Srillig * The pattern 'do { } while (0)' is a common technique to define a 28bed82d19Srillig * preprocessor macro that behaves like a single statement. There is 29bed82d19Srillig * nothing unusual or surprising about the constant condition. 302c260a3fSrillig * Before tree.c 1.202 from 2021-01-31, lint warned about it. 31bed82d19Srillig */ 32bed82d19Srillig void 33bed82d19Srillig do_while_0(void) 34bed82d19Srillig { 35bed82d19Srillig do { 36bed82d19Srillig 372c260a3fSrillig } while (0); 38bed82d19Srillig } 39bed82d19Srillig 40bed82d19Srillig void 41bed82d19Srillig do_while_1(void) 42bed82d19Srillig { 43bed82d19Srillig do { 4465e5c21bSrillig /* expect+1: warning: constant in conditional context [161] */ 4565e5c21bSrillig } while (1); 46bed82d19Srillig } 47966d6a64Srillig 48966d6a64Srillig extern void println(const char *); 49966d6a64Srillig 500d0d46fdSrillig /* 510d0d46fdSrillig * Since 2021-02-28, lint no longer warns about constant controlling 520d0d46fdSrillig * expressions involving sizeof since these are completely legitimate. 530d0d46fdSrillig */ 54966d6a64Srillig void 55966d6a64Srillig test_sizeof(void) 56966d6a64Srillig { 570d0d46fdSrillig if (sizeof(int) > sizeof(char)) 58966d6a64Srillig println("very probable"); 590d0d46fdSrillig if (sizeof(int) < sizeof(char)) 60966d6a64Srillig println("impossible"); 61966d6a64Srillig } 624ffab226Srillig 634ffab226Srillig const _Bool conditions[] = { 644ffab226Srillig /* XXX: Why no warning here? */ 654ffab226Srillig 13 < 13, 664ffab226Srillig /* XXX: Why no warning here? */ 674ffab226Srillig 0 < 0, 684ffab226Srillig /* XXX: Why no warning here? */ 694ffab226Srillig 0 != 0, 704ffab226Srillig /* expect+1: warning: constant in conditional context [161] */ 714ffab226Srillig 0 == 0 && 1 == 0, 724ffab226Srillig /* expect+1: warning: constant in conditional context [161] */ 734ffab226Srillig 1 == 0 || 2 == 1, 744ffab226Srillig /* expect+2: warning: constant in conditional context [161] */ 754ffab226Srillig /* expect+1: error: non-constant initializer [177] */ 764ffab226Srillig 0 == 0 && ""[0] == '\0', 774ffab226Srillig /* expect+2: warning: constant in conditional context [161] */ 784ffab226Srillig /* expect+1: error: non-constant initializer [177] */ 794ffab226Srillig ""[0] == '\0' && 0 == 0, 8069d93118Srillig /* C99 6.6p3: Constant expressions shall not contain [...] comma */ 8169d93118Srillig /* expect+2: warning: expression has null effect [129] */ 8269d93118Srillig /* expect+1: error: non-constant initializer [177] */ 8369d93118Srillig (0 == 0, 1 == 0), 844ffab226Srillig }; 85