xref: /netbsd-src/tests/usr.bin/xlint/lint1/gcc_attribute_var.c (revision 5a40444efdf3cd153afa7885ed2b4741fd695c80)
1*5a40444eSrillig /*	$NetBSD: gcc_attribute_var.c,v 1.13 2024/09/28 15:51:40 rillig Exp $	*/
2b4c7d7a7Srillig # 3 "gcc_attribute_var.c"
3b4c7d7a7Srillig 
4b4c7d7a7Srillig /*
5b4c7d7a7Srillig  * Tests for the GCC __attribute__ for variables.
6b4c7d7a7Srillig  *
7b4c7d7a7Srillig  * https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
8b4c7d7a7Srillig  */
9b4c7d7a7Srillig 
10b2baa501Srillig /* lint1-extra-flags: -X 351 */
11b2baa501Srillig 
12b4c7d7a7Srillig void
13b4c7d7a7Srillig write_to_page(unsigned index, char ch)
14b4c7d7a7Srillig {
15b4c7d7a7Srillig 	static char page[4096]
16b4c7d7a7Srillig 	    __attribute__((__aligned__(4096)));
17b4c7d7a7Srillig 
18b4c7d7a7Srillig 	page[index] = ch;
19b4c7d7a7Srillig }
20b4c7d7a7Srillig 
21b4c7d7a7Srillig void
22b4c7d7a7Srillig placement(
23b4c7d7a7Srillig     __attribute__((__deprecated__)) int before,
24b4c7d7a7Srillig     int __attribute__((__deprecated__)) between,
25b4c7d7a7Srillig     int after __attribute__((__deprecated__))
26b4c7d7a7Srillig );
27b4c7d7a7Srillig 
281deb95faSrillig void println(void);
291deb95faSrillig 
301deb95faSrillig /*
311deb95faSrillig  * A GCC extension allows statement of the form __attribute__((fallthrough)),
32*5a40444eSrillig  * therefore, to avoid shift/reduce conflicts in the grammar, the attributes
33*5a40444eSrillig  * cannot be part of the declaration specifiers between begin_type/end_type.
341deb95faSrillig  */
351deb95faSrillig void
361deb95faSrillig ambiguity_for_attribute(void)
371deb95faSrillig {
381deb95faSrillig 	__attribute__((unused)) _Bool var1;
391deb95faSrillig 
401deb95faSrillig 	switch (1) {
411deb95faSrillig 	case 1:
421deb95faSrillig 		println();
431deb95faSrillig 		__attribute__((unused)) _Bool var2;
441deb95faSrillig 		__attribute__((fallthrough));
451deb95faSrillig 		case 2:
461deb95faSrillig 			println();
471deb95faSrillig 	}
481deb95faSrillig }
491deb95faSrillig 
50a8ba6cc9Srillig void
51a8ba6cc9Srillig attribute_after_array_brackets(
52a8ba6cc9Srillig     const char *argv[] __attribute__((__unused__))
53a8ba6cc9Srillig )
54a8ba6cc9Srillig {
55a8ba6cc9Srillig }
56c147c2e8Srillig 
57c147c2e8Srillig struct attribute_in_member_declaration {
58c147c2e8Srillig 	int __attribute__(())
59c147c2e8Srillig 	    x __attribute__(()),
60c147c2e8Srillig 	    y __attribute__(());
61c147c2e8Srillig 
62c147c2e8Srillig 	unsigned int __attribute__(())
63c147c2e8Srillig 	    bit1:1 __attribute__(()),
64c147c2e8Srillig 	    bit2:2 __attribute__(()),
65c147c2e8Srillig 	    bit3:3 __attribute__(());
66c147c2e8Srillig };
671d4abfd0Srillig 
681d4abfd0Srillig 
691d4abfd0Srillig void
701d4abfd0Srillig anonymous_members(void)
711d4abfd0Srillig {
721d4abfd0Srillig 	struct single_attribute_outer {
731d4abfd0Srillig 		struct single_attribute_inner {
741d4abfd0Srillig 			int member;
751d4abfd0Srillig 		} __attribute__(());
761d4abfd0Srillig 	} __attribute__(());
771d4abfd0Srillig 
781d4abfd0Srillig 	struct multiple_attributes_outer {
791d4abfd0Srillig 		struct multiple_attributes_inner {
801d4abfd0Srillig 			int member;
811d4abfd0Srillig 		} __attribute__(()) __attribute__(());
821d4abfd0Srillig 	} __attribute__(()) __attribute__(());
831d4abfd0Srillig }
84