msg_241.c revision 1.7
11.7Srillig/*	$NetBSD: msg_241.c,v 1.7 2021/10/30 22:04:42 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.4Srillig	sink_bool(!c);		/* expect: 241 */
311.4Srillig	sink_color(~c);		/* expect: 241 */
321.4Srillig	++c;			/* expect: 241 */
331.4Srillig	--c;			/* expect: 241 */
341.4Srillig	c++;			/* expect: 241 */
351.4Srillig	c--;			/* expect: 241 */
361.4Srillig	sink_color(+c);		/* expect: 241 */
371.4Srillig	sink_color(-c);		/* expect: 241 */
381.4Srillig	sink_color(c * c);	/* expect: 241 */
391.4Srillig	sink_color(c / c);	/* expect: 241 */
401.4Srillig	sink_color(c % c);	/* expect: 241 */
411.4Srillig	sink_color(c + c);	/* expect: 241 */
421.4Srillig	sink_color(c - c);	/* expect: 241 */
431.4Srillig	sink_color(c << c);	/* expect: 241 */
441.4Srillig	sink_color(c >> c);	/* expect: 241 */
451.4Srillig
461.4Srillig	sink_bool(c < c);
471.4Srillig	sink_bool(c <= c);
481.4Srillig	sink_bool(c > c);
491.4Srillig	sink_bool(c >= c);
501.4Srillig	sink_bool(c == c);
511.4Srillig	sink_bool(c != c);
521.4Srillig
531.4Srillig	sink_color(c & c);	/* expect: 241 */
541.4Srillig	sink_color(c ^ c);	/* expect: 241 */
551.4Srillig	sink_color(c | c);	/* expect: 241 */
561.4Srillig
571.4Srillig	sink_bool(c && c);	/* expect: 241 */
581.4Srillig	sink_bool(c || c);	/* expect: 241 */
591.4Srillig	sink_color(c ? c : BLUE);
601.3Srillig
611.3Srillig	c = GREEN;
621.4Srillig	c *= c;			/* expect: 241 */
631.4Srillig	c /= c;			/* expect: 241 */
641.4Srillig	c %= c;			/* expect: 241 */
651.4Srillig	c += c;			/* expect: 241 */
661.4Srillig	c -= c;			/* expect: 241 */
671.4Srillig	c <<= c;		/* expect: 241 */
681.4Srillig	c >>= c;		/* expect: 241 */
691.4Srillig	c &= c;			/* expect: 241 */
701.4Srillig	c ^= c;			/* expect: 241 */
711.4Srillig	c |= c;			/* expect: 241 */
721.3Srillig
731.3Srillig	/* The cast to unsigned is required by GCC at WARNS=6. */
741.4Srillig	c &= ~(unsigned)GREEN;	/* expect: 241 */
751.3Srillig}
761.5Srillig
771.5Srilligvoid
781.5Srilligcover_typeok_enum(enum color c, int i)
791.5Srillig{
801.5Srillig	/* expect+2: warning: dubious operation on enum, op * [241] */
811.5Srillig	/* expect+1: warning: combination of 'enum color' and 'int', op > [242] */
821.5Srillig	if (c * i > 5)
831.5Srillig		return;
841.5Srillig}
851.6Srillig
861.6Srilligconst char *
871.6Srilligcolor_name(enum color c)
881.6Srillig{
891.7Srillig	static const char *name[] = {
901.7Srillig	    [RED] = "red",
911.7Srillig	    [GREEN] = "green",
921.7Srillig	    [BLUE] = "blue",
931.7Srillig	};
941.6Srillig
951.6Srillig	if (c == RED)
961.6Srillig		return *(c + name); /* unusual but allowed */
971.6Srillig	if (c == GREEN)
981.6Srillig		return c[name]; /* even more unusual */
991.6Srillig	return name[c];
1001.6Srillig}
101