/*      $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__(());
}