msg_161.c revision 1.10
11.10Srillig/*	$NetBSD: msg_161.c,v 1.10 2023/03/28 14:44:35 rillig Exp $	*/
21.1Srillig# 3 "msg_161.c"
31.1Srillig
41.1Srillig// Test for message: constant in conditional context [161]
51.1Srillig
61.10Srillig/* lint1-extra-flags: -h -X 351 */
71.2Srillig
81.2Srilligvoid
91.2Srilligwhile_1(void)
101.2Srillig{
111.9Srillig	/* expect+1: warning: constant in conditional context [161] */
121.9Srillig	while (1)
131.2Srillig		continue;
141.2Srillig}
151.2Srillig
161.2Srilligvoid
171.2Srilligwhile_0(void)
181.2Srillig{
191.9Srillig	/* expect+1: warning: constant in conditional context [161] */
201.9Srillig	while (0) {
211.9Srillig		/* expect+1: warning: statement not reached [193] */
221.9Srillig		continue;
231.9Srillig	}
241.2Srillig}
251.2Srillig
261.2Srillig/*
271.2Srillig * The pattern 'do { } while (0)' is a common technique to define a
281.2Srillig * preprocessor macro that behaves like a single statement.  There is
291.2Srillig * nothing unusual or surprising about the constant condition.
301.4Srillig * Before tree.c 1.202 from 2021-01-31, lint warned about it.
311.2Srillig */
321.2Srilligvoid
331.2Srilligdo_while_0(void)
341.2Srillig{
351.2Srillig	do {
361.2Srillig
371.4Srillig	} while (0);
381.2Srillig}
391.2Srillig
401.2Srilligvoid
411.2Srilligdo_while_1(void)
421.2Srillig{
431.2Srillig	do {
441.9Srillig		/* expect+1: warning: constant in conditional context [161] */
451.9Srillig	} while (1);
461.2Srillig}
471.5Srillig
481.5Srilligextern void println(const char *);
491.5Srillig
501.6Srillig/*
511.6Srillig * Since 2021-02-28, lint no longer warns about constant controlling
521.6Srillig * expressions involving sizeof since these are completely legitimate.
531.6Srillig */
541.5Srilligvoid
551.5Srilligtest_sizeof(void)
561.5Srillig{
571.6Srillig	if (sizeof(int) > sizeof(char))
581.5Srillig		println("very probable");
591.6Srillig	if (sizeof(int) < sizeof(char))
601.5Srillig		println("impossible");
611.5Srillig}
621.8Srillig
631.8Srilligconst _Bool conditions[] = {
641.8Srillig	/* XXX: Why no warning here? */
651.8Srillig	13 < 13,
661.8Srillig	/* XXX: Why no warning here? */
671.8Srillig	0 < 0,
681.8Srillig	/* XXX: Why no warning here? */
691.8Srillig	0 != 0,
701.8Srillig	/* expect+1: warning: constant in conditional context [161] */
711.8Srillig	0 == 0 && 1 == 0,
721.8Srillig	/* expect+1: warning: constant in conditional context [161] */
731.8Srillig	1 == 0 || 2 == 1,
741.8Srillig	/* expect+2: warning: constant in conditional context [161] */
751.8Srillig	/* expect+1: error: non-constant initializer [177] */
761.8Srillig	0 == 0 && ""[0] == '\0',
771.8Srillig	/* expect+2: warning: constant in conditional context [161] */
781.8Srillig	/* expect+1: error: non-constant initializer [177] */
791.8Srillig	""[0] == '\0' && 0 == 0,
801.8Srillig};
81