msg_348.c revision 1.6 1 1.6 rillig /* $NetBSD: msg_348.c,v 1.6 2023/01/08 15:18:02 rillig Exp $ */
2 1.1 rillig # 3 "msg_348.c"
3 1.1 rillig
4 1.1 rillig // Test for message 348: maximum value %d of '%s' does not match maximum array index %d [348]
5 1.1 rillig
6 1.3 rillig /* lint1-extra-flags: -r */
7 1.3 rillig
8 1.1 rillig enum color {
9 1.1 rillig red,
10 1.1 rillig green,
11 1.5 rillig /* expect+2: previous declaration of 'blue' [260] */
12 1.5 rillig /* expect+1: previous declaration of 'blue' [260] */
13 1.1 rillig blue
14 1.1 rillig };
15 1.1 rillig
16 1.1 rillig const char *
17 1.1 rillig color_name(enum color color)
18 1.1 rillig {
19 1.1 rillig static const char *name[] = {
20 1.1 rillig "red",
21 1.1 rillig "green",
22 1.1 rillig "blue"
23 1.1 rillig };
24 1.1 rillig /* No warning since the maximum enum value matches the array size. */
25 1.1 rillig return name[color];
26 1.1 rillig }
27 1.1 rillig
28 1.1 rillig const char *
29 1.1 rillig color_name_too_few(enum color color)
30 1.1 rillig {
31 1.1 rillig static const char *name[] = {
32 1.1 rillig "red",
33 1.1 rillig "green"
34 1.1 rillig };
35 1.1 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 1 [348] */
36 1.1 rillig return name[color];
37 1.1 rillig }
38 1.1 rillig
39 1.1 rillig const char *
40 1.1 rillig color_name_too_many(enum color color)
41 1.1 rillig {
42 1.1 rillig static const char *name[] = {
43 1.1 rillig "red",
44 1.1 rillig "green",
45 1.1 rillig "blue",
46 1.1 rillig "black"
47 1.1 rillig };
48 1.1 rillig /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
49 1.1 rillig return name[color];
50 1.1 rillig }
51 1.1 rillig
52 1.1 rillig const char *
53 1.1 rillig color_name_computed_index(enum color color)
54 1.1 rillig {
55 1.1 rillig static const char *name[] = {
56 1.1 rillig "unused",
57 1.1 rillig "red",
58 1.1 rillig "green",
59 1.1 rillig "blue"
60 1.1 rillig };
61 1.6 rillig /* No warning since the array index is not a plain identifier. */
62 1.1 rillig return name[color + 1];
63 1.1 rillig }
64 1.1 rillig
65 1.1 rillig const char *
66 1.1 rillig color_name_cast_from_int(int c)
67 1.1 rillig {
68 1.1 rillig static const char *name[] = {
69 1.1 rillig "unused",
70 1.1 rillig "red",
71 1.1 rillig "green",
72 1.1 rillig "blue"
73 1.1 rillig };
74 1.6 rillig /*
75 1.6 rillig * No warning since the array index before conversion is not a plain
76 1.6 rillig * identifier.
77 1.6 rillig */
78 1.1 rillig return name[(enum color)(c + 1)];
79 1.1 rillig }
80 1.1 rillig
81 1.1 rillig const char *
82 1.2 rillig color_name_explicit_cast_to_int(enum color color)
83 1.2 rillig {
84 1.2 rillig static const char *name[] = {
85 1.2 rillig "red",
86 1.2 rillig "green",
87 1.2 rillig };
88 1.4 rillig /* No warning due to the explicit cast. */
89 1.2 rillig return name[(int)color];
90 1.2 rillig }
91 1.2 rillig
92 1.2 rillig const char *
93 1.1 rillig color_name_computed_pointer(enum color color, const char *name)
94 1.1 rillig {
95 1.6 rillig /*
96 1.6 rillig * No warning since the first operand of the selection expression
97 1.6 rillig * is '(&name)', whose type is not an array but instead a
98 1.6 rillig * 'pointer to pointer to const char'.
99 1.6 rillig */
100 1.1 rillig return (&name)[color];
101 1.1 rillig }
102 1.1 rillig
103 1.1 rillig extern const char *incomplete_color_name[];
104 1.1 rillig
105 1.1 rillig const char *
106 1.1 rillig color_name_incomplete_array(enum color color)
107 1.1 rillig {
108 1.1 rillig /* No warning since 'incomplete_color_name' is incomplete. */
109 1.1 rillig return incomplete_color_name[color];
110 1.1 rillig }
111 1.1 rillig
112 1.1 rillig enum large {
113 1.1 rillig /* expect+1: warning: integral constant too large [56] */
114 1.1 rillig min = -1LL << 40,
115 1.1 rillig /* expect+1: warning: integral constant too large [56] */
116 1.1 rillig max = 1LL << 40,
117 1.1 rillig zero = 0
118 1.1 rillig };
119 1.1 rillig
120 1.1 rillig const char *
121 1.1 rillig large_name(enum large large)
122 1.1 rillig {
123 1.1 rillig static const char *name[] = {
124 1.1 rillig "dummy",
125 1.1 rillig };
126 1.1 rillig /* No warning since at least 1 enum constant is outside of INT. */
127 1.1 rillig return name[large];
128 1.1 rillig }
129 1.3 rillig
130 1.3 rillig enum color_with_count {
131 1.3 rillig cc_red,
132 1.3 rillig cc_green,
133 1.3 rillig cc_blue,
134 1.3 rillig cc_num_values
135 1.3 rillig };
136 1.3 rillig
137 1.3 rillig const char *
138 1.3 rillig color_with_count_name(enum color_with_count color)
139 1.3 rillig {
140 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
141 1.6 rillig /*
142 1.6 rillig * No warning since the word 'num' in the last enum constant
143 1.6 rillig * MAY indicate a convenience constant for the total number of
144 1.6 rillig * values, instead of a regular enum value.
145 1.6 rillig */
146 1.3 rillig return name[color];
147 1.3 rillig }
148 1.3 rillig
149 1.3 rillig /*
150 1.3 rillig * If the last enum constant contains "num" in its name, it is not
151 1.3 rillig * necessarily the count of the other enum values, it may also be a
152 1.3 rillig * legitimate application value, therefore don't warn in this case.
153 1.3 rillig */
154 1.3 rillig const char *
155 1.3 rillig color_with_num(enum color_with_count color)
156 1.3 rillig {
157 1.3 rillig static const char *const name[] = { "r", "g", "b", "num" };
158 1.3 rillig /* No warning since the maximum values already match. */
159 1.3 rillig return name[color];
160 1.3 rillig }
161 1.3 rillig
162 1.3 rillig enum color_with_uc_count {
163 1.3 rillig CC_RED,
164 1.3 rillig CC_GREEN,
165 1.3 rillig CC_BLUE,
166 1.3 rillig CC_NUM_VALUES
167 1.3 rillig };
168 1.3 rillig
169 1.3 rillig const char *
170 1.3 rillig color_with_uc_count_name(enum color_with_uc_count color)
171 1.3 rillig {
172 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
173 1.3 rillig /* No warning since the maximum enum constant is a count. */
174 1.3 rillig return name[color];
175 1.3 rillig }
176 1.6 rillig
177 1.6 rillig enum uppercase_max {
178 1.6 rillig M_FIRST,
179 1.6 rillig M_SECOND,
180 1.6 rillig /* expect+1: previous declaration of 'M_MAX' [260] */
181 1.6 rillig M_MAX
182 1.6 rillig };
183 1.6 rillig
184 1.6 rillig const char *
185 1.6 rillig uppercase_max_name(enum uppercase_max x)
186 1.6 rillig {
187 1.6 rillig static const char *const name[] = { "first", "second" };
188 1.6 rillig /* expect+1: warning: maximum value 2 of 'enum uppercase_max' does not match maximum array index 1 [348] */
189 1.6 rillig return name[x];
190 1.6 rillig }
191 1.6 rillig
192 1.6 rillig enum lowercase_max {
193 1.6 rillig M_first,
194 1.6 rillig M_second,
195 1.6 rillig /* expect+1: previous declaration of 'M_max' [260] */
196 1.6 rillig M_max
197 1.6 rillig };
198 1.6 rillig
199 1.6 rillig const char *
200 1.6 rillig lowercase_max_name(enum lowercase_max x)
201 1.6 rillig {
202 1.6 rillig static const char *const name[] = { "first", "second" };
203 1.6 rillig /* expect+1: warning: maximum value 2 of 'enum lowercase_max' does not match maximum array index 1 [348] */
204 1.6 rillig return name[x];
205 1.6 rillig }
206