/* $NetBSD: gcc_attribute_var.c,v 1.13 2024/09/28 15:51:40 rillig Exp $ */
# 3 "gcc_attribute_var.c"
/*
* Tests for the GCC __attribute__ for variables.
*
*
https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
*/
/* lint1-extra-flags: -X 351 */
void
write_to_page(unsigned index, char ch)
{
static char page[4096]
__attribute__((__aligned__(4096)));
page[index] = ch;
}
void
placement(
__attribute__((__deprecated__)) int before,
int __attribute__((__deprecated__)) between,
int after __attribute__((__deprecated__))
);
void println(void);
/*
* A GCC extension allows statement of the form __attribute__((fallthrough)),
* therefore, to avoid shift/reduce conflicts in the grammar, the attributes
* cannot be part of the declaration specifiers between begin_type/end_type.
*/
void
ambiguity_for_attribute(void)
{
__attribute__((unused)) _Bool var1;
switch (1) {
case 1:
println();
__attribute__((unused)) _Bool var2;
__attribute__((fallthrough));
case 2:
println();
}
}
void
attribute_after_array_brackets(
const char *argv[] __attribute__((__unused__))
)
{
}
struct attribute_in_member_declaration {
int __attribute__(())
x __attribute__(()),
y __attribute__(());
unsigned int __attribute__(())
bit1:1 __attribute__(()),
bit2:2 __attribute__(()),
bit3:3 __attribute__(());
};
void
anonymous_members(void)
{
struct single_attribute_outer {
struct single_attribute_inner {
int member;
} __attribute__(());
} __attribute__(());
struct multiple_attributes_outer {
struct multiple_attributes_inner {
int member;
} __attribute__(()) __attribute__(());
} __attribute__(()) __attribute__(());
}