xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_348.c (revision aef5eb5f59cdfe8314f1b5f78ac04eb144e44010)
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