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)15b4c7d7a7Srilligtest(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)31154b5ed6Srilligunused_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