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