msg_241.c revision 1.8
11.8Srillig/*	$NetBSD: msg_241.c,v 1.8 2022/06/16 21:24:41 rillig Exp $	*/
21.1Srillig# 3 "msg_241.c"
31.1Srillig
41.1Srillig// 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.8Srillig	/* expect+1: warning: dubious operation on enum, op ! [241] */
311.8Srillig	sink_bool(!c);
321.8Srillig	/* expect+1: warning: dubious operation on enum, op ~ [241] */
331.8Srillig	sink_color(~c);
341.8Srillig	/* expect+1: warning: dubious operation on enum, op ++x [241] */
351.8Srillig	++c;
361.8Srillig	/* expect+1: warning: dubious operation on enum, op --x [241] */
371.8Srillig	--c;
381.8Srillig	/* expect+1: warning: dubious operation on enum, op x++ [241] */
391.8Srillig	c++;
401.8Srillig	/* expect+1: warning: dubious operation on enum, op x-- [241] */
411.8Srillig	c--;
421.8Srillig	/* expect+1: warning: dubious operation on enum, op + [241] */
431.8Srillig	sink_color(+c);
441.8Srillig	/* expect+1: warning: dubious operation on enum, op - [241] */
451.8Srillig	sink_color(-c);
461.8Srillig	/* expect+1: warning: dubious operation on enum, op * [241] */
471.8Srillig	sink_color(c * c);
481.8Srillig	/* expect+1: warning: dubious operation on enum, op / [241] */
491.8Srillig	sink_color(c / c);
501.8Srillig	/* expect+1: warning: dubious operation on enum, op % [241] */
511.8Srillig	sink_color(c % c);
521.8Srillig	/* expect+1: warning: dubious operation on enum, op + [241] */
531.8Srillig	sink_color(c + c);
541.8Srillig	/* expect+1: warning: dubious operation on enum, op - [241] */
551.8Srillig	sink_color(c - c);
561.8Srillig	/* expect+1: warning: dubious operation on enum, op << [241] */
571.8Srillig	sink_color(c << c);
581.8Srillig	/* 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.8Srillig	/* expect+1: warning: dubious operation on enum, op & [241] */
691.8Srillig	sink_color(c & c);
701.8Srillig	/* expect+1: warning: dubious operation on enum, op ^ [241] */
711.8Srillig	sink_color(c ^ c);
721.8Srillig	/* expect+1: warning: dubious operation on enum, op | [241] */
731.8Srillig	sink_color(c | c);
741.8Srillig
751.8Srillig	/* expect+1: warning: dubious operation on enum, op && [241] */
761.8Srillig	sink_bool(c && c);
771.8Srillig	/* 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.8Srillig	/* expect+1: warning: dubious operation on enum, op *= [241] */
831.8Srillig	c *= c;
841.8Srillig	/* expect+1: warning: dubious operation on enum, op /= [241] */
851.8Srillig	c /= c;
861.8Srillig	/* expect+1: warning: dubious operation on enum, op %= [241] */
871.8Srillig	c %= c;
881.8Srillig	/* expect+1: warning: dubious operation on enum, op += [241] */
891.8Srillig	c += c;
901.8Srillig	/* expect+1: warning: dubious operation on enum, op -= [241] */
911.8Srillig	c -= c;
921.8Srillig	/* expect+1: warning: dubious operation on enum, op <<= [241] */
931.8Srillig	c <<= c;
941.8Srillig	/* expect+1: warning: dubious operation on enum, op >>= [241] */
951.8Srillig	c >>= c;
961.8Srillig	/* expect+1: warning: dubious operation on enum, op &= [241] */
971.8Srillig	c &= c;
981.8Srillig	/* expect+1: warning: dubious operation on enum, op ^= [241] */
991.8Srillig	c ^= c;
1001.8Srillig	/* 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.8Srillig	/* 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.5Srillig	/* expect+2: warning: dubious operation on enum, op * [241] */
1121.5Srillig	/* 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