11.11Srillig/*	$NetBSD: msg_241.c,v 1.11 2023/07/09 11:01:27 rillig Exp $	*/
21.1Srillig# 3 "msg_241.c"
31.1Srillig
41.11Srillig// Test for message: dubious operation '%s' on enum [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.10Srillig/* lint1-extra-flags: -e -X 351 */
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.11Srillig	/* expect+1: warning: dubious operation '!' on enum [241] */
311.8Srillig	sink_bool(!c);
321.11Srillig	/* expect+1: warning: dubious operation '~' on enum [241] */
331.8Srillig	sink_color(~c);
341.11Srillig	/* expect+1: warning: dubious operation '++x' on enum [241] */
351.8Srillig	++c;
361.11Srillig	/* expect+1: warning: dubious operation '--x' on enum [241] */
371.8Srillig	--c;
381.11Srillig	/* expect+1: warning: dubious operation 'x++' on enum [241] */
391.8Srillig	c++;
401.11Srillig	/* expect+1: warning: dubious operation 'x--' on enum [241] */
411.8Srillig	c--;
421.11Srillig	/* expect+1: warning: dubious operation '+' on enum [241] */
431.8Srillig	sink_color(+c);
441.11Srillig	/* expect+1: warning: dubious operation '-' on enum [241] */
451.8Srillig	sink_color(-c);
461.11Srillig	/* expect+1: warning: dubious operation '*' on enum [241] */
471.8Srillig	sink_color(c * c);
481.11Srillig	/* expect+1: warning: dubious operation '/' on enum [241] */
491.8Srillig	sink_color(c / c);
501.11Srillig	/* expect+1: warning: dubious operation '%' on enum [241] */
511.8Srillig	sink_color(c % c);
521.11Srillig	/* expect+1: warning: dubious operation '+' on enum [241] */
531.8Srillig	sink_color(c + c);
541.11Srillig	/* expect+1: warning: dubious operation '-' on enum [241] */
551.8Srillig	sink_color(c - c);
561.11Srillig	/* expect+1: warning: dubious operation '<<' on enum [241] */
571.8Srillig	sink_color(c << c);
581.11Srillig	/* expect+1: warning: dubious operation '>>' on enum [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.11Srillig	/* expect+1: warning: dubious operation '&' on enum [241] */
691.8Srillig	sink_color(c & c);
701.11Srillig	/* expect+1: warning: dubious operation '^' on enum [241] */
711.8Srillig	sink_color(c ^ c);
721.11Srillig	/* expect+1: warning: dubious operation '|' on enum [241] */
731.8Srillig	sink_color(c | c);
741.8Srillig
751.11Srillig	/* expect+1: warning: dubious operation '&&' on enum [241] */
761.8Srillig	sink_bool(c && c);
771.11Srillig	/* expect+1: warning: dubious operation '||' on enum [241] */
781.8Srillig	sink_bool(c || c);
791.4Srillig	sink_color(c ? c : BLUE);
801.3Srillig
811.3Srillig	c = GREEN;
821.11Srillig	/* expect+1: warning: dubious operation '*=' on enum [241] */
831.8Srillig	c *= c;
841.11Srillig	/* expect+1: warning: dubious operation '/=' on enum [241] */
851.8Srillig	c /= c;
861.11Srillig	/* expect+1: warning: dubious operation '%=' on enum [241] */
871.8Srillig	c %= c;
881.11Srillig	/* expect+1: warning: dubious operation '+=' on enum [241] */
891.8Srillig	c += c;
901.11Srillig	/* expect+1: warning: dubious operation '-=' on enum [241] */
911.8Srillig	c -= c;
921.11Srillig	/* expect+1: warning: dubious operation '<<=' on enum [241] */
931.8Srillig	c <<= c;
941.11Srillig	/* expect+1: warning: dubious operation '>>=' on enum [241] */
951.8Srillig	c >>= c;
961.11Srillig	/* expect+1: warning: dubious operation '&=' on enum [241] */
971.8Srillig	c &= c;
981.11Srillig	/* expect+1: warning: dubious operation '^=' on enum [241] */
991.8Srillig	c ^= c;
1001.11Srillig	/* expect+1: warning: dubious operation '|=' on enum [241] */
1011.8Srillig	c |= c;
1021.3Srillig
1031.3Srillig	/* The cast to unsigned is required by GCC at WARNS=6. */
1041.11Srillig	/* expect+1: warning: dubious operation '&=' on enum [241] */
1051.8Srillig	c &= ~(unsigned)GREEN;
1061.3Srillig}
1071.5Srillig
1081.5Srilligvoid
1091.5Srilligcover_typeok_enum(enum color c, int i)
1101.5Srillig{
1111.11Srillig	/* expect+2: warning: dubious operation '*' on enum [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