msg_161.c revision 1.13
11.13Srillig/*	$NetBSD: msg_161.c,v 1.13 2025/04/06 20:56:14 rillig Exp $	*/
21.1Srillig# 3 "msg_161.c"
31.1Srillig
41.1Srillig// Test for message: constant in conditional context [161]
51.13Srillig// This message is not used.  There is no evidence that it detects real bugs,
61.13Srillig// instead it produces noise for perfectly valid code.
71.1Srillig
81.10Srillig/* lint1-extra-flags: -h -X 351 */
91.2Srillig
101.2Srilligvoid
111.2Srilligwhile_1(void)
121.2Srillig{
131.13Srillig	/* was: warning: constant in conditional context [161] */
141.9Srillig	while (1)
151.2Srillig		continue;
161.2Srillig}
171.2Srillig
181.2Srilligvoid
191.2Srilligwhile_0(void)
201.2Srillig{
211.13Srillig	/* was: warning: constant in conditional context [161] */
221.9Srillig	while (0) {
231.12Srillig		/* expect+1: warning: 'continue' statement not reached [193] */
241.9Srillig		continue;
251.9Srillig	}
261.2Srillig}
271.2Srillig
281.2Srillig/*
291.2Srillig * The pattern 'do { } while (0)' is a common technique to define a
301.2Srillig * preprocessor macro that behaves like a single statement.  There is
311.2Srillig * nothing unusual or surprising about the constant condition.
321.4Srillig * Before tree.c 1.202 from 2021-01-31, lint warned about it.
331.2Srillig */
341.2Srilligvoid
351.2Srilligdo_while_0(void)
361.2Srillig{
371.2Srillig	do {
381.2Srillig
391.4Srillig	} while (0);
401.2Srillig}
411.2Srillig
421.2Srilligvoid
431.2Srilligdo_while_1(void)
441.2Srillig{
451.2Srillig	do {
461.13Srillig		/* was: warning: constant in conditional context [161] */
471.9Srillig	} while (1);
481.2Srillig}
491.5Srillig
501.5Srilligextern void println(const char *);
511.5Srillig
521.6Srillig/*
531.6Srillig * Since 2021-02-28, lint no longer warns about constant controlling
541.6Srillig * expressions involving sizeof since these are completely legitimate.
551.6Srillig */
561.5Srilligvoid
571.5Srilligtest_sizeof(void)
581.5Srillig{
591.6Srillig	if (sizeof(int) > sizeof(char))
601.5Srillig		println("very probable");
611.6Srillig	if (sizeof(int) < sizeof(char))
621.5Srillig		println("impossible");
631.5Srillig}
641.8Srillig
651.8Srilligconst _Bool conditions[] = {
661.8Srillig	/* XXX: Why no warning here? */
671.8Srillig	13 < 13,
681.8Srillig	/* XXX: Why no warning here? */
691.8Srillig	0 < 0,
701.8Srillig	/* XXX: Why no warning here? */
711.8Srillig	0 != 0,
721.13Srillig	/* was: warning: constant in conditional context [161] */
731.8Srillig	0 == 0 && 1 == 0,
741.13Srillig	/* was: warning: constant in conditional context [161] */
751.8Srillig	1 == 0 || 2 == 1,
761.13Srillig	/* was: warning: constant in conditional context [161] */
771.8Srillig	/* expect+1: error: non-constant initializer [177] */
781.8Srillig	0 == 0 && ""[0] == '\0',
791.13Srillig	/* was: warning: constant in conditional context [161] */
801.8Srillig	/* expect+1: error: non-constant initializer [177] */
811.8Srillig	""[0] == '\0' && 0 == 0,
821.11Srillig	/* C99 6.6p3: Constant expressions shall not contain [...] comma */
831.11Srillig	/* expect+2: warning: expression has null effect [129] */
841.11Srillig	/* expect+1: error: non-constant initializer [177] */
851.11Srillig	(0 == 0, 1 == 0),
861.8Srillig};
87