gcc_attribute_var.c revision 1.13
11.13Srillig/*	$NetBSD: gcc_attribute_var.c,v 1.13 2024/09/28 15:51:40 rillig Exp $	*/
21.1Srillig# 3 "gcc_attribute_var.c"
31.1Srillig
41.1Srillig/*
51.1Srillig * Tests for the GCC __attribute__ for variables.
61.1Srillig *
71.1Srillig * https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
81.1Srillig */
91.1Srillig
101.8Srillig/* lint1-extra-flags: -X 351 */
111.8Srillig
121.1Srilligvoid
131.1Srilligwrite_to_page(unsigned index, char ch)
141.1Srillig{
151.1Srillig	static char page[4096]
161.1Srillig	    __attribute__((__aligned__(4096)));
171.1Srillig
181.1Srillig	page[index] = ch;
191.1Srillig}
201.1Srillig
211.1Srilligvoid
221.1Srilligplacement(
231.1Srillig    __attribute__((__deprecated__)) int before,
241.1Srillig    int __attribute__((__deprecated__)) between,
251.1Srillig    int after __attribute__((__deprecated__))
261.1Srillig);
271.1Srillig
281.2Srilligvoid println(void);
291.2Srillig
301.2Srillig/*
311.2Srillig * A GCC extension allows statement of the form __attribute__((fallthrough)),
321.13Srillig * therefore, to avoid shift/reduce conflicts in the grammar, the attributes
331.13Srillig * cannot be part of the declaration specifiers between begin_type/end_type.
341.2Srillig */
351.2Srilligvoid
361.2Srilligambiguity_for_attribute(void)
371.2Srillig{
381.2Srillig	__attribute__((unused)) _Bool var1;
391.2Srillig
401.2Srillig	switch (1) {
411.2Srillig	case 1:
421.2Srillig		println();
431.2Srillig		__attribute__((unused)) _Bool var2;
441.2Srillig		__attribute__((fallthrough));
451.2Srillig		case 2:
461.2Srillig			println();
471.2Srillig	}
481.2Srillig}
491.2Srillig
501.4Srilligvoid
511.4Srilligattribute_after_array_brackets(
521.4Srillig    const char *argv[] __attribute__((__unused__))
531.4Srillig)
541.4Srillig{
551.4Srillig}
561.10Srillig
571.10Srilligstruct attribute_in_member_declaration {
581.10Srillig	int __attribute__(())
591.10Srillig	    x __attribute__(()),
601.10Srillig	    y __attribute__(());
611.10Srillig
621.10Srillig	unsigned int __attribute__(())
631.10Srillig	    bit1:1 __attribute__(()),
641.10Srillig	    bit2:2 __attribute__(()),
651.10Srillig	    bit3:3 __attribute__(());
661.10Srillig};
671.12Srillig
681.12Srillig
691.12Srilligvoid
701.12Srilliganonymous_members(void)
711.12Srillig{
721.12Srillig	struct single_attribute_outer {
731.12Srillig		struct single_attribute_inner {
741.12Srillig			int member;
751.12Srillig		} __attribute__(());
761.12Srillig	} __attribute__(());
771.12Srillig
781.12Srillig	struct multiple_attributes_outer {
791.12Srillig		struct multiple_attributes_inner {
801.12Srillig			int member;
811.12Srillig		} __attribute__(()) __attribute__(());
821.12Srillig	} __attribute__(()) __attribute__(());
831.12Srillig}
84