msg_348.c revision 1.4 1 1.4 rillig /* $NetBSD: msg_348.c,v 1.4 2021/11/01 18:11:26 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+2: previous declaration of blue [260] */
12 1.3 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.1 rillig /* No warning since the array index is not a name. */
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.1 rillig /* No warning since the array index before conversion is not a name. */
75 1.1 rillig return name[(enum color)(c + 1)];
76 1.1 rillig }
77 1.1 rillig
78 1.1 rillig const char *
79 1.2 rillig color_name_explicit_cast_to_int(enum color color)
80 1.2 rillig {
81 1.2 rillig static const char *name[] = {
82 1.2 rillig "red",
83 1.2 rillig "green",
84 1.2 rillig };
85 1.4 rillig /* No warning due to the explicit cast. */
86 1.2 rillig return name[(int)color];
87 1.2 rillig }
88 1.2 rillig
89 1.2 rillig const char *
90 1.1 rillig color_name_computed_pointer(enum color color, const char *name)
91 1.1 rillig {
92 1.1 rillig /* No warning since 'name' is not an array. */
93 1.1 rillig return (&name)[color];
94 1.1 rillig }
95 1.1 rillig
96 1.1 rillig extern const char *incomplete_color_name[];
97 1.1 rillig
98 1.1 rillig const char *
99 1.1 rillig color_name_incomplete_array(enum color color)
100 1.1 rillig {
101 1.1 rillig /* No warning since 'incomplete_color_name' is incomplete. */
102 1.1 rillig return incomplete_color_name[color];
103 1.1 rillig }
104 1.1 rillig
105 1.1 rillig enum large {
106 1.1 rillig /* expect+1: warning: integral constant too large [56] */
107 1.1 rillig min = -1LL << 40,
108 1.1 rillig /* expect+1: warning: integral constant too large [56] */
109 1.1 rillig max = 1LL << 40,
110 1.1 rillig zero = 0
111 1.1 rillig };
112 1.1 rillig
113 1.1 rillig const char *
114 1.1 rillig large_name(enum large large)
115 1.1 rillig {
116 1.1 rillig static const char *name[] = {
117 1.1 rillig "dummy",
118 1.1 rillig };
119 1.1 rillig /* No warning since at least 1 enum constant is outside of INT. */
120 1.1 rillig return name[large];
121 1.1 rillig }
122 1.3 rillig
123 1.3 rillig enum color_with_count {
124 1.3 rillig cc_red,
125 1.3 rillig cc_green,
126 1.3 rillig cc_blue,
127 1.3 rillig cc_num_values
128 1.3 rillig };
129 1.3 rillig
130 1.3 rillig const char *
131 1.3 rillig color_with_count_name(enum color_with_count color)
132 1.3 rillig {
133 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
134 1.3 rillig /* No warning since the maximum enum constant is a count. */
135 1.3 rillig return name[color];
136 1.3 rillig }
137 1.3 rillig
138 1.3 rillig /*
139 1.3 rillig * If the last enum constant contains "num" in its name, it is not
140 1.3 rillig * necessarily the count of the other enum values, it may also be a
141 1.3 rillig * legitimate application value, therefore don't warn in this case.
142 1.3 rillig */
143 1.3 rillig const char *
144 1.3 rillig color_with_num(enum color_with_count color)
145 1.3 rillig {
146 1.3 rillig static const char *const name[] = { "r", "g", "b", "num" };
147 1.3 rillig /* No warning since the maximum values already match. */
148 1.3 rillig return name[color];
149 1.3 rillig }
150 1.3 rillig
151 1.3 rillig enum color_with_uc_count {
152 1.3 rillig CC_RED,
153 1.3 rillig CC_GREEN,
154 1.3 rillig CC_BLUE,
155 1.3 rillig CC_NUM_VALUES
156 1.3 rillig };
157 1.3 rillig
158 1.3 rillig const char *
159 1.3 rillig color_with_uc_count_name(enum color_with_uc_count color)
160 1.3 rillig {
161 1.3 rillig static const char *const name[] = { "red", "green", "blue" };
162 1.3 rillig /* No warning since the maximum enum constant is a count. */
163 1.3 rillig return name[color];
164 1.3 rillig }
165