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