msg_241.c revision 1.6
11.6Srillig/* $NetBSD: msg_241.c,v 1.6 2021/08/16 20:11:03 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.6Srillig static const char *name[] = { "red", "green", "blue" }; 901.6Srillig 911.6Srillig if (c == RED) 921.6Srillig return *(c + name); /* unusual but allowed */ 931.6Srillig if (c == GREEN) 941.6Srillig return c[name]; /* even more unusual */ 951.6Srillig return name[c]; 961.6Srillig} 97