msg_161.c revision 1.13
1/*	$NetBSD: msg_161.c,v 1.13 2025/04/06 20:56:14 rillig Exp $	*/
2# 3 "msg_161.c"
3
4// Test for message: constant in conditional context [161]
5// This message is not used.  There is no evidence that it detects real bugs,
6// instead it produces noise for perfectly valid code.
7
8/* lint1-extra-flags: -h -X 351 */
9
10void
11while_1(void)
12{
13	/* was: warning: constant in conditional context [161] */
14	while (1)
15		continue;
16}
17
18void
19while_0(void)
20{
21	/* was: warning: constant in conditional context [161] */
22	while (0) {
23		/* expect+1: warning: 'continue' statement not reached [193] */
24		continue;
25	}
26}
27
28/*
29 * The pattern 'do { } while (0)' is a common technique to define a
30 * preprocessor macro that behaves like a single statement.  There is
31 * nothing unusual or surprising about the constant condition.
32 * Before tree.c 1.202 from 2021-01-31, lint warned about it.
33 */
34void
35do_while_0(void)
36{
37	do {
38
39	} while (0);
40}
41
42void
43do_while_1(void)
44{
45	do {
46		/* was: warning: constant in conditional context [161] */
47	} while (1);
48}
49
50extern void println(const char *);
51
52/*
53 * Since 2021-02-28, lint no longer warns about constant controlling
54 * expressions involving sizeof since these are completely legitimate.
55 */
56void
57test_sizeof(void)
58{
59	if (sizeof(int) > sizeof(char))
60		println("very probable");
61	if (sizeof(int) < sizeof(char))
62		println("impossible");
63}
64
65const _Bool conditions[] = {
66	/* XXX: Why no warning here? */
67	13 < 13,
68	/* XXX: Why no warning here? */
69	0 < 0,
70	/* XXX: Why no warning here? */
71	0 != 0,
72	/* was: warning: constant in conditional context [161] */
73	0 == 0 && 1 == 0,
74	/* was: warning: constant in conditional context [161] */
75	1 == 0 || 2 == 1,
76	/* was: warning: constant in conditional context [161] */
77	/* expect+1: error: non-constant initializer [177] */
78	0 == 0 && ""[0] == '\0',
79	/* was: warning: constant in conditional context [161] */
80	/* expect+1: error: non-constant initializer [177] */
81	""[0] == '\0' && 0 == 0,
82	/* C99 6.6p3: Constant expressions shall not contain [...] comma */
83	/* expect+2: warning: expression has null effect [129] */
84	/* expect+1: error: non-constant initializer [177] */
85	(0 == 0, 1 == 0),
86};
87