xref: /netbsd-src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.c (revision b2baa50111d645353fa30b4deab0f79d93650c8c)
1*b2baa501Srillig /*	$NetBSD: gcc_attribute_stmt.c,v 1.4 2023/03/28 14:44:34 rillig Exp $	*/
2b4c7d7a7Srillig # 3 "gcc_attribute_stmt.c"
3b4c7d7a7Srillig 
4b4c7d7a7Srillig /*
5b4c7d7a7Srillig  * Tests for the GCC __attribute__ for statements.
6b4c7d7a7Srillig  *
7b4c7d7a7Srillig  * https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html
8b4c7d7a7Srillig  */
9b4c7d7a7Srillig 
10*b2baa501Srillig /* lint1-extra-flags: -X 351 */
11*b2baa501Srillig 
12b4c7d7a7Srillig void println(const char *);
13b4c7d7a7Srillig 
14b4c7d7a7Srillig void
attribute_fallthrough(int i)15b4c7d7a7Srillig attribute_fallthrough(int i)
16b4c7d7a7Srillig {
17b4c7d7a7Srillig 	switch (i) {
18b4c7d7a7Srillig 	case 5:
19b4c7d7a7Srillig 		/*
20b4c7d7a7Srillig 		 * The attribute 'fallthrough' is only valid after a
21b4c7d7a7Srillig 		 * preceding statement. This is already caught by GCC, so
22b4c7d7a7Srillig 		 * lint does not need to care.
23b4c7d7a7Srillig 		 */
24b4c7d7a7Srillig 		__attribute__((__fallthrough__));
25b4c7d7a7Srillig 	case 3:
26b4c7d7a7Srillig 		println("odd");
27b4c7d7a7Srillig 		__attribute__((__fallthrough__));
28b4c7d7a7Srillig 	case 2:
29b4c7d7a7Srillig 		/*
30b4c7d7a7Srillig 		 * Only the null statement can have the attribute
31b4c7d7a7Srillig 		 * 'fallthrough'. This is already caught by GCC, so
32b4c7d7a7Srillig 		 * lint does not need to care.
33b4c7d7a7Srillig 		 */
34b4c7d7a7Srillig 		/* expect+2: error: syntax error '__attribute__' [249] */
35b4c7d7a7Srillig 		println("prime")
36b4c7d7a7Srillig 		    __attribute__((__fallthrough__));
37b4c7d7a7Srillig 	}
38b4c7d7a7Srillig }
39