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