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