1 1.14 rillig /* $NetBSD: msg_348.c,v 1.14 2025/07/11 19:03:01 rillig Exp $ */ 2 1.1 rillig # 3 "msg_348.c" 3 1.1 rillig 4 1.12 rillig // Test for message: maximum value %d for '%s' of type '%s' does not match maximum array index %d [348] 5 1.1 rillig 6 1.9 rillig /* lint1-extra-flags: -r -X 351 */ 7 1.3 rillig 8 1.1 rillig enum color { 9 1.1 rillig red, 10 1.1 rillig green, 11 1.8 rillig /* expect+5: previous declaration of 'blue' [260] */ 12 1.8 rillig /* expect+4: previous declaration of 'blue' [260] */ 13 1.8 rillig /* expect+3: previous declaration of 'blue' [260] */ 14 1.5 rillig /* expect+2: previous declaration of 'blue' [260] */ 15 1.5 rillig /* expect+1: previous declaration of 'blue' [260] */ 16 1.1 rillig blue 17 1.1 rillig }; 18 1.1 rillig 19 1.1 rillig const char * 20 1.1 rillig color_name(enum color color) 21 1.1 rillig { 22 1.1 rillig static const char *name[] = { 23 1.1 rillig "red", 24 1.1 rillig "green", 25 1.1 rillig "blue" 26 1.1 rillig }; 27 1.12 rillig /* No warning since the maximum enum value equals the maximum array index. */ 28 1.1 rillig return name[color]; 29 1.1 rillig } 30 1.1 rillig 31 1.1 rillig const char * 32 1.1 rillig color_name_too_few(enum color color) 33 1.1 rillig { 34 1.1 rillig static const char *name[] = { 35 1.1 rillig "red", 36 1.1 rillig "green" 37 1.1 rillig }; 38 1.12 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 1 [348] */ 39 1.1 rillig return name[color]; 40 1.1 rillig } 41 1.1 rillig 42 1.1 rillig const char * 43 1.1 rillig color_name_too_many(enum color color) 44 1.1 rillig { 45 1.1 rillig static const char *name[] = { 46 1.1 rillig "red", 47 1.1 rillig "green", 48 1.1 rillig "blue", 49 1.1 rillig "black" 50 1.1 rillig }; 51 1.12 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */ 52 1.1 rillig return name[color]; 53 1.1 rillig } 54 1.1 rillig 55 1.1 rillig const char * 56 1.1 rillig color_name_computed_index(enum color color) 57 1.1 rillig { 58 1.1 rillig static const char *name[] = { 59 1.1 rillig "unused", 60 1.1 rillig "red", 61 1.1 rillig "green", 62 1.1 rillig "blue" 63 1.1 rillig }; 64 1.6 rillig /* No warning since the array index is not a plain identifier. */ 65 1.1 rillig return name[color + 1]; 66 1.1 rillig } 67 1.1 rillig 68 1.1 rillig const char * 69 1.1 rillig color_name_cast_from_int(int c) 70 1.1 rillig { 71 1.1 rillig static const char *name[] = { 72 1.1 rillig "unused", 73 1.1 rillig "red", 74 1.1 rillig "green", 75 1.1 rillig "blue" 76 1.1 rillig }; 77 1.6 rillig /* 78 1.6 rillig * No warning since the array index before conversion is not a plain 79 1.6 rillig * identifier. 80 1.6 rillig */ 81 1.1 rillig return name[(enum color)(c + 1)]; 82 1.1 rillig } 83 1.1 rillig 84 1.1 rillig const char * 85 1.2 rillig color_name_explicit_cast_to_int(enum color color) 86 1.2 rillig { 87 1.2 rillig static const char *name[] = { 88 1.2 rillig "red", 89 1.2 rillig "green", 90 1.2 rillig }; 91 1.4 rillig /* No warning due to the explicit cast. */ 92 1.2 rillig return name[(int)color]; 93 1.2 rillig } 94 1.2 rillig 95 1.2 rillig const char * 96 1.1 rillig color_name_computed_pointer(enum color color, const char *name) 97 1.1 rillig { 98 1.6 rillig /* 99 1.6 rillig * No warning since the first operand of the selection expression 100 1.6 rillig * is '(&name)', whose type is not an array but instead a 101 1.6 rillig * 'pointer to pointer to const char'. 102 1.6 rillig */ 103 1.1 rillig return (&name)[color]; 104 1.1 rillig } 105 1.1 rillig 106 1.8 rillig /* 107 1.8 rillig * If the accessed array has character type, it may contain a trailing null 108 1.8 rillig * character. 109 1.8 rillig */ 110 1.8 rillig void 111 1.8 rillig color_initial_letter(enum color color) 112 1.8 rillig { 113 1.8 rillig static const char len_2_null[] = "RG"; 114 1.8 rillig static const char len_3_null[] = "RGB"; 115 1.8 rillig static const char len_4_null[] = "RGB_"; 116 1.8 rillig 117 1.8 rillig static const char len_2_of_3[3] = "RG"; 118 1.8 rillig static const char len_3_of_3[3] = "RGB"; 119 1.8 rillig static const char len_4_of_4[4] = "RGB_"; 120 1.8 rillig 121 1.14 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 1 [348] */ 122 1.8 rillig if (len_2_null[color] != '\0') 123 1.8 rillig return; 124 1.8 rillig 125 1.8 rillig if (len_3_null[color] != '\0') 126 1.8 rillig return; 127 1.8 rillig 128 1.14 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */ 129 1.8 rillig if (len_4_null[color] != '\0') 130 1.8 rillig return; 131 1.8 rillig 132 1.8 rillig /* 133 1.8 rillig * The array has 3 elements, as expected. If lint were to inspect 134 1.8 rillig * the content of the array, it could see that [2] is a null 135 1.8 rillig * character. That null character may be intended though. 136 1.8 rillig */ 137 1.8 rillig if (len_2_of_3[color] != '\0') 138 1.8 rillig return; 139 1.8 rillig 140 1.8 rillig if (len_3_of_3[color] != '\0') 141 1.8 rillig return; 142 1.8 rillig 143 1.12 rillig /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */ 144 1.8 rillig if (len_4_of_4[color]) 145 1.8 rillig return; 146 1.8 rillig } 147 1.8 rillig 148 1.1 rillig extern const char *incomplete_color_name[]; 149 1.1 rillig 150 1.1 rillig const char * 151 1.1 rillig color_name_incomplete_array(enum color color) 152 1.1 rillig { 153 1.1 rillig /* No warning since 'incomplete_color_name' is incomplete. */ 154 1.1 rillig return incomplete_color_name[color]; 155 1.1 rillig } 156 1.1 rillig 157 1.1 rillig enum large { 158 1.11 rillig /* expect+1: warning: constant -0x10000000000 too large for 'int' [56] */ 159 1.1 rillig min = -1LL << 40, 160 1.11 rillig /* expect+1: warning: constant 0x10000000000 too large for 'int' [56] */ 161 1.1 rillig max = 1LL << 40, 162 1.1 rillig zero = 0 163 1.1 rillig }; 164 1.1 rillig 165 1.1 rillig const char * 166 1.1 rillig large_name(enum large large) 167 1.1 rillig { 168 1.1 rillig static const char *name[] = { 169 1.1 rillig "dummy", 170 1.1 rillig }; 171 1.1 rillig /* No warning since at least 1 enum constant is outside of INT. */ 172 1.1 rillig return name[large]; 173 1.1 rillig } 174 1.3 rillig 175 1.3 rillig enum color_with_count { 176 1.3 rillig cc_red, 177 1.3 rillig cc_green, 178 1.3 rillig cc_blue, 179 1.3 rillig cc_num_values 180 1.3 rillig }; 181 1.3 rillig 182 1.3 rillig const char * 183 1.3 rillig color_with_count_name(enum color_with_count color) 184 1.3 rillig { 185 1.3 rillig static const char *const name[] = { "red", "green", "blue" }; 186 1.6 rillig /* 187 1.6 rillig * No warning since the word 'num' in the last enum constant 188 1.6 rillig * MAY indicate a convenience constant for the total number of 189 1.6 rillig * values, instead of a regular enum value. 190 1.6 rillig */ 191 1.3 rillig return name[color]; 192 1.3 rillig } 193 1.3 rillig 194 1.3 rillig /* 195 1.3 rillig * If the last enum constant contains "num" in its name, it is not 196 1.3 rillig * necessarily the count of the other enum values, it may also be a 197 1.3 rillig * legitimate application value, therefore don't warn in this case. 198 1.3 rillig */ 199 1.3 rillig const char * 200 1.3 rillig color_with_num(enum color_with_count color) 201 1.3 rillig { 202 1.3 rillig static const char *const name[] = { "r", "g", "b", "num" }; 203 1.3 rillig /* No warning since the maximum values already match. */ 204 1.3 rillig return name[color]; 205 1.3 rillig } 206 1.3 rillig 207 1.3 rillig enum color_with_uc_count { 208 1.3 rillig CC_RED, 209 1.3 rillig CC_GREEN, 210 1.3 rillig CC_BLUE, 211 1.3 rillig CC_NUM_VALUES 212 1.3 rillig }; 213 1.3 rillig 214 1.3 rillig const char * 215 1.3 rillig color_with_uc_count_name(enum color_with_uc_count color) 216 1.3 rillig { 217 1.3 rillig static const char *const name[] = { "red", "green", "blue" }; 218 1.3 rillig /* No warning since the maximum enum constant is a count. */ 219 1.3 rillig return name[color]; 220 1.3 rillig } 221 1.6 rillig 222 1.6 rillig enum uppercase_max { 223 1.6 rillig M_FIRST, 224 1.6 rillig M_SECOND, 225 1.6 rillig M_MAX 226 1.6 rillig }; 227 1.6 rillig 228 1.6 rillig const char * 229 1.6 rillig uppercase_max_name(enum uppercase_max x) 230 1.6 rillig { 231 1.6 rillig static const char *const name[] = { "first", "second" }; 232 1.6 rillig return name[x]; 233 1.6 rillig } 234 1.6 rillig 235 1.6 rillig enum lowercase_max { 236 1.6 rillig M_first, 237 1.6 rillig M_second, 238 1.6 rillig M_max 239 1.6 rillig }; 240 1.6 rillig 241 1.6 rillig const char * 242 1.6 rillig lowercase_max_name(enum lowercase_max x) 243 1.6 rillig { 244 1.6 rillig static const char *const name[] = { "first", "second" }; 245 1.6 rillig return name[x]; 246 1.6 rillig } 247 1.12 rillig 248 1.12 rillig enum uppercase_n { 249 1.12 rillig UPPERCASE_N_FIRST, 250 1.12 rillig UPPERCASE_N_LAST, 251 1.12 rillig N_UPPERCASE_N, 252 1.12 rillig }; 253 1.12 rillig 254 1.12 rillig const char* 255 1.12 rillig uppercase_n_name(enum uppercase_n x) 256 1.12 rillig { 257 1.12 rillig static const char *const name[] = { "first", "last" }; 258 1.12 rillig return name[x]; 259 1.12 rillig } 260 1.13 rillig 261 1.13 rillig 262 1.13 rillig enum unit_prefix { 263 1.14 rillig /* expect+4: previous declaration of 'MEGA' [260] */ 264 1.14 rillig /* expect+3: previous declaration of 'MEGA' [260] */ 265 1.13 rillig /* expect+2: previous declaration of 'MEGA' [260] */ 266 1.13 rillig /* expect+1: previous declaration of 'MEGA' [260] */ 267 1.13 rillig NONE = 0, KILO = 1, MEGA = 2 268 1.13 rillig }; 269 1.13 rillig 270 1.13 rillig char 271 1.13 rillig unit_name(enum unit_prefix prefix) 272 1.13 rillig { 273 1.13 rillig char name; 274 1.13 rillig 275 1.13 rillig static const char name_short[] = "-K"; 276 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 1 [348] */ 277 1.13 rillig name = name_short[prefix]; 278 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 1 [348] */ 279 1.13 rillig name = "-K"[prefix]; 280 1.13 rillig 281 1.13 rillig static const char name_no_nul[] = { '-', 'K', 'M' }; 282 1.13 rillig name = name_no_nul[prefix]; 283 1.13 rillig name = (char[]){'-', 'K', 'M'}[prefix]; 284 1.13 rillig 285 1.13 rillig static const char name_nul[] = "-KM"; 286 1.13 rillig name = name_nul[prefix]; 287 1.13 rillig name = "-KM"[prefix]; 288 1.13 rillig 289 1.13 rillig static const char name_long[] = "-KMG"; 290 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 3 [348] */ 291 1.13 rillig name = name_long[prefix]; 292 1.14 rillig /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 3 [348] */ 293 1.13 rillig name = "-KMG"[prefix]; 294 1.13 rillig 295 1.13 rillig return name; 296 1.13 rillig } 297