xref: /netbsd-src/tests/usr.bin/xlint/lint1/gcc_attribute_label.c (revision b2baa50111d645353fa30b4deab0f79d93650c8c)
1*b2baa501Srillig /*	$NetBSD: gcc_attribute_label.c,v 1.4 2023/03/28 14:44:34 rillig Exp $	*/
2b4c7d7a7Srillig # 3 "gcc_attribute_label.c"
3b4c7d7a7Srillig 
4b4c7d7a7Srillig /*
5b4c7d7a7Srillig  * Tests for the GCC __attribute__ for labels.
6b4c7d7a7Srillig  *
7b4c7d7a7Srillig  * https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html
8b4c7d7a7Srillig  */
9b4c7d7a7Srillig 
10*b2baa501Srillig /* lint1-extra-flags: -X 351 */
11*b2baa501Srillig 
12b4c7d7a7Srillig void dead(void);
13b4c7d7a7Srillig 
14b4c7d7a7Srillig void
test(int i)15b4c7d7a7Srillig test(int i)
16b4c7d7a7Srillig {
17b4c7d7a7Srillig 	if (i < 1000)
18b4c7d7a7Srillig 		goto hot;
19b4c7d7a7Srillig error:
20b4c7d7a7Srillig 	__attribute__((__cold__));
21b4c7d7a7Srillig 	dead();
22b4c7d7a7Srillig 
23b4c7d7a7Srillig hot:
24b4c7d7a7Srillig 	__attribute__((__hot__));
25b4c7d7a7Srillig 	if (i < 0)
26b4c7d7a7Srillig 		goto error;
27b4c7d7a7Srillig }
28154b5ed6Srillig 
29154b5ed6Srillig /* GCC allows a label to be marked as (possibly) unused. */
30154b5ed6Srillig void
unused_labels(int x)31154b5ed6Srillig unused_labels(int x)
32154b5ed6Srillig {
33154b5ed6Srillig 	switch (x) {
34154b5ed6Srillig 	case 3:
35154b5ed6Srillig 		__attribute__((__unused__))
36154b5ed6Srillig 		break;
37154b5ed6Srillig 	case 4:
38154b5ed6Srillig 		goto label;
39154b5ed6Srillig 	label:
40154b5ed6Srillig 		__attribute__((__unused__))
41154b5ed6Srillig 		return;
42154b5ed6Srillig 	}
43154b5ed6Srillig 
44154b5ed6Srillig 	/*
45154b5ed6Srillig 	 * The GCC attributes may only occur after a label; they cannot occur
46154b5ed6Srillig 	 * before an arbitrary statement.
47154b5ed6Srillig 	 */
48154b5ed6Srillig 	__attribute__((__unused__))
49154b5ed6Srillig 	/* expect+1: error: syntax error 'return' [249] */
50154b5ed6Srillig 	return;
51154b5ed6Srillig }
52