root/tests/usr.bin/xlint/lint1/gcc_attribute_var.c
/*      $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__(());
}