msg_241.c revision 1.9
11.9Srillig/*	$NetBSD: msg_241.c,v 1.9 2022/06/22 19:23:18 rillig Exp $	*/
21.1Srillig# 3 "msg_241.c"
31.1Srillig
41.9Srillig// Test for message: dubious operation on enum, op '%s' [241]
51.3Srillig//
61.3Srillig// As of February 2021, the option -e is not enabled by default in
71.3Srillig// share/mk/sys.mk, therefore this message is neither well-known nor
81.3Srillig// well-tested.
91.1Srillig
101.3Srillig/* lint1-extra-flags: -e */
111.3Srillig
121.3Srillig/*
131.3Srillig * Enums are a possible implementation of bit-sets.
141.3Srillig */
151.3Srilligenum color {
161.3Srillig	RED	= 1 << 0,
171.3Srillig	GREEN	= 1 << 1,
181.3Srillig	BLUE	= 1 << 2
191.3Srillig};
201.3Srillig
211.4Srilligextern void sink_bool(_Bool);
221.4Srilligextern void sink_int(int);
231.4Srilligextern void sink_color(enum color);
241.3Srillig
251.3Srilligvoid
261.3Srilligexample(void)
271.3Srillig{
281.3Srillig	enum color c = RED;
291.3Srillig
301.9Srillig	/* expect+1: warning: dubious operation on enum, op '!' [241] */
311.8Srillig	sink_bool(!c);
321.9Srillig	/* expect+1: warning: dubious operation on enum, op '~' [241] */
331.8Srillig	sink_color(~c);
341.9Srillig	/* expect+1: warning: dubious operation on enum, op '++x' [241] */
351.8Srillig	++c;
361.9Srillig	/* expect+1: warning: dubious operation on enum, op '--x' [241] */
371.8Srillig	--c;
381.9Srillig	/* expect+1: warning: dubious operation on enum, op 'x++' [241] */
391.8Srillig	c++;
401.9Srillig	/* expect+1: warning: dubious operation on enum, op 'x--' [241] */
411.8Srillig	c--;
421.9Srillig	/* expect+1: warning: dubious operation on enum, op '+' [241] */
431.8Srillig	sink_color(+c);
441.9Srillig	/* expect+1: warning: dubious operation on enum, op '-' [241] */
451.8Srillig	sink_color(-c);
461.9Srillig	/* expect+1: warning: dubious operation on enum, op '*' [241] */
471.8Srillig	sink_color(c * c);
481.9Srillig	/* expect+1: warning: dubious operation on enum, op '/' [241] */
491.8Srillig	sink_color(c / c);
501.9Srillig	/* expect+1: warning: dubious operation on enum, op '%' [241] */
511.8Srillig	sink_color(c % c);
521.9Srillig	/* expect+1: warning: dubious operation on enum, op '+' [241] */
531.8Srillig	sink_color(c + c);
541.9Srillig	/* expect+1: warning: dubious operation on enum, op '-' [241] */
551.8Srillig	sink_color(c - c);
561.9Srillig	/* expect+1: warning: dubious operation on enum, op '<<' [241] */
571.8Srillig	sink_color(c << c);
581.9Srillig	/* expect+1: warning: dubious operation on enum, op '>>' [241] */
591.8Srillig	sink_color(c >> c);
601.4Srillig
611.4Srillig	sink_bool(c < c);
621.4Srillig	sink_bool(c <= c);
631.4Srillig	sink_bool(c > c);
641.4Srillig	sink_bool(c >= c);
651.4Srillig	sink_bool(c == c);
661.4Srillig	sink_bool(c != c);
671.4Srillig
681.9Srillig	/* expect+1: warning: dubious operation on enum, op '&' [241] */
691.8Srillig	sink_color(c & c);
701.9Srillig	/* expect+1: warning: dubious operation on enum, op '^' [241] */
711.8Srillig	sink_color(c ^ c);
721.9Srillig	/* expect+1: warning: dubious operation on enum, op '|' [241] */
731.8Srillig	sink_color(c | c);
741.8Srillig
751.9Srillig	/* expect+1: warning: dubious operation on enum, op '&&' [241] */
761.8Srillig	sink_bool(c && c);
771.9Srillig	/* expect+1: warning: dubious operation on enum, op '||' [241] */
781.8Srillig	sink_bool(c || c);
791.4Srillig	sink_color(c ? c : BLUE);
801.3Srillig
811.3Srillig	c = GREEN;
821.9Srillig	/* expect+1: warning: dubious operation on enum, op '*=' [241] */
831.8Srillig	c *= c;
841.9Srillig	/* expect+1: warning: dubious operation on enum, op '/=' [241] */
851.8Srillig	c /= c;
861.9Srillig	/* expect+1: warning: dubious operation on enum, op '%=' [241] */
871.8Srillig	c %= c;
881.9Srillig	/* expect+1: warning: dubious operation on enum, op '+=' [241] */
891.8Srillig	c += c;
901.9Srillig	/* expect+1: warning: dubious operation on enum, op '-=' [241] */
911.8Srillig	c -= c;
921.9Srillig	/* expect+1: warning: dubious operation on enum, op '<<=' [241] */
931.8Srillig	c <<= c;
941.9Srillig	/* expect+1: warning: dubious operation on enum, op '>>=' [241] */
951.8Srillig	c >>= c;
961.9Srillig	/* expect+1: warning: dubious operation on enum, op '&=' [241] */
971.8Srillig	c &= c;
981.9Srillig	/* expect+1: warning: dubious operation on enum, op '^=' [241] */
991.8Srillig	c ^= c;
1001.9Srillig	/* expect+1: warning: dubious operation on enum, op '|=' [241] */
1011.8Srillig	c |= c;
1021.3Srillig
1031.3Srillig	/* The cast to unsigned is required by GCC at WARNS=6. */
1041.9Srillig	/* expect+1: warning: dubious operation on enum, op '&=' [241] */
1051.8Srillig	c &= ~(unsigned)GREEN;
1061.3Srillig}
1071.5Srillig
1081.5Srilligvoid
1091.5Srilligcover_typeok_enum(enum color c, int i)
1101.5Srillig{
1111.9Srillig	/* expect+2: warning: dubious operation on enum, op '*' [241] */
1121.9Srillig	/* expect+1: warning: combination of 'enum color' and 'int', op '>' [242] */
1131.5Srillig	if (c * i > 5)
1141.5Srillig		return;
1151.5Srillig}
1161.6Srillig
1171.6Srilligconst char *
1181.6Srilligcolor_name(enum color c)
1191.6Srillig{
1201.7Srillig	static const char *name[] = {
1211.7Srillig	    [RED] = "red",
1221.7Srillig	    [GREEN] = "green",
1231.7Srillig	    [BLUE] = "blue",
1241.7Srillig	};
1251.6Srillig
1261.6Srillig	if (c == RED)
1271.6Srillig		return *(c + name); /* unusual but allowed */
1281.6Srillig	if (c == GREEN)
1291.6Srillig		return c[name]; /* even more unusual */
1301.6Srillig	return name[c];
1311.6Srillig}
132