1 /* $NetBSD: msg_348.c,v 1.5 2022/06/11 11:52:13 rillig Exp $ */ 2 # 3 "msg_348.c" 3 4 // Test for message 348: maximum value %d of '%s' does not match maximum array index %d [348] 5 6 /* lint1-extra-flags: -r */ 7 8 enum color { 9 red, 10 green, 11 /* expect+2: previous declaration of 'blue' [260] */ 12 /* expect+1: previous declaration of 'blue' [260] */ 13 blue 14 }; 15 16 const char * 17 color_name(enum color color) 18 { 19 static const char *name[] = { 20 "red", 21 "green", 22 "blue" 23 }; 24 /* No warning since the maximum enum value matches the array size. */ 25 return name[color]; 26 } 27 28 const char * 29 color_name_too_few(enum color color) 30 { 31 static const char *name[] = { 32 "red", 33 "green" 34 }; 35 /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 1 [348] */ 36 return name[color]; 37 } 38 39 const char * 40 color_name_too_many(enum color color) 41 { 42 static const char *name[] = { 43 "red", 44 "green", 45 "blue", 46 "black" 47 }; 48 /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */ 49 return name[color]; 50 } 51 52 const char * 53 color_name_computed_index(enum color color) 54 { 55 static const char *name[] = { 56 "unused", 57 "red", 58 "green", 59 "blue" 60 }; 61 /* No warning since the array index is not a name. */ 62 return name[color + 1]; 63 } 64 65 const char * 66 color_name_cast_from_int(int c) 67 { 68 static const char *name[] = { 69 "unused", 70 "red", 71 "green", 72 "blue" 73 }; 74 /* No warning since the array index before conversion is not a name. */ 75 return name[(enum color)(c + 1)]; 76 } 77 78 const char * 79 color_name_explicit_cast_to_int(enum color color) 80 { 81 static const char *name[] = { 82 "red", 83 "green", 84 }; 85 /* No warning due to the explicit cast. */ 86 return name[(int)color]; 87 } 88 89 const char * 90 color_name_computed_pointer(enum color color, const char *name) 91 { 92 /* No warning since 'name' is not an array. */ 93 return (&name)[color]; 94 } 95 96 extern const char *incomplete_color_name[]; 97 98 const char * 99 color_name_incomplete_array(enum color color) 100 { 101 /* No warning since 'incomplete_color_name' is incomplete. */ 102 return incomplete_color_name[color]; 103 } 104 105 enum large { 106 /* expect+1: warning: integral constant too large [56] */ 107 min = -1LL << 40, 108 /* expect+1: warning: integral constant too large [56] */ 109 max = 1LL << 40, 110 zero = 0 111 }; 112 113 const char * 114 large_name(enum large large) 115 { 116 static const char *name[] = { 117 "dummy", 118 }; 119 /* No warning since at least 1 enum constant is outside of INT. */ 120 return name[large]; 121 } 122 123 enum color_with_count { 124 cc_red, 125 cc_green, 126 cc_blue, 127 cc_num_values 128 }; 129 130 const char * 131 color_with_count_name(enum color_with_count color) 132 { 133 static const char *const name[] = { "red", "green", "blue" }; 134 /* No warning since the maximum enum constant is a count. */ 135 return name[color]; 136 } 137 138 /* 139 * If the last enum constant contains "num" in its name, it is not 140 * necessarily the count of the other enum values, it may also be a 141 * legitimate application value, therefore don't warn in this case. 142 */ 143 const char * 144 color_with_num(enum color_with_count color) 145 { 146 static const char *const name[] = { "r", "g", "b", "num" }; 147 /* No warning since the maximum values already match. */ 148 return name[color]; 149 } 150 151 enum color_with_uc_count { 152 CC_RED, 153 CC_GREEN, 154 CC_BLUE, 155 CC_NUM_VALUES 156 }; 157 158 const char * 159 color_with_uc_count_name(enum color_with_uc_count color) 160 { 161 static const char *const name[] = { "red", "green", "blue" }; 162 /* No warning since the maximum enum constant is a count. */ 163 return name[color]; 164 } 165