msg_168.c revision 1.4
11.4Srillig/*	$NetBSD: msg_168.c,v 1.4 2021/03/25 22:15:38 rillig Exp $	*/
21.1Srillig# 3 "msg_168.c"
31.1Srillig
41.1Srillig// Test for message: array subscript cannot be > %d: %ld [168]
51.1Srillig
61.2Srilligvoid print_string(const char *);
71.2Srilligvoid print_char(char);
81.2Srillig
91.2Srilligvoid
101.2Srilligexample(void)
111.2Srillig{
121.4Srillig	char buf[20] = {};	/* empty initializer is a GCC extension */
131.2Srillig
141.2Srillig	print_string(buf + 19);	/* inside the array */
151.2Srillig
161.2Srillig	/*
171.2Srillig	 * It is valid to point at the end of the array, but reading a
181.2Srillig	 * character from there invokes undefined behavior.
191.2Srillig	 *
201.2Srillig	 * The pointer to the end of the array is typically used in (begin,
211.2Srillig	 * end) tuples.  These are more common in C++ than in C though.
221.2Srillig	 */
231.2Srillig	print_string(buf + 20);
241.2Srillig
251.2Srillig	print_string(buf + 21);	/* undefined behavior, not detected */
261.2Srillig
271.2Srillig	print_char(buf[19]);
281.2Srillig	print_char(buf[20]);	/* expect: 168 */
291.2Srillig}
301.3Srillig
311.3Srilligvoid
321.3Srilligarray_with_c99_initializer(void)
331.3Srillig{
341.3Srillig	static const char *const to_roman[] = {
351.3Srillig	    ['0'] = "undefined",
361.3Srillig	    ['5'] = "V",
371.3Srillig	    ['9'] = "IX"
381.3Srillig	};
391.3Srillig
401.3Srillig	print_string(to_roman['9']);	/*FIXME*//* expect: 168 */
411.3Srillig	print_string(to_roman[':']);	/* expect: 168 */
421.3Srillig}
43