xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_161.c (revision 6937eff333b197fb14840f0e58df0f7a0edfd51a)
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