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