gcc_attribute_var.c revision 1.10
1/*	$NetBSD: gcc_attribute_var.c,v 1.10 2023/07/15 21:40:03 rillig Exp $	*/
2# 3 "gcc_attribute_var.c"
3
4/*
5 * Tests for the GCC __attribute__ for variables.
6 *
7 * https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
8 */
9
10/* lint1-extra-flags: -X 351 */
11
12void
13write_to_page(unsigned index, char ch)
14{
15	static char page[4096]
16	    __attribute__((__aligned__(4096)));
17
18	page[index] = ch;
19}
20
21void
22placement(
23    __attribute__((__deprecated__)) int before,
24    int __attribute__((__deprecated__)) between,
25    int after __attribute__((__deprecated__))
26);
27
28void println(void);
29
30/*
31 * Since cgram.y 1.294 from 2021-07-10, lint did not accept declarations that
32 * started with __attribute__, due to a newly and accidentally introduced
33 * shift/reduce conflict in the grammar.
34 *
35 * A GCC extension allows statement of the form __attribute__((fallthrough)),
36 * thus starting with __attribute__.  This is the 'shift' in the conflict.
37 * The 'reduce' in the conflict was begin_type.
38 *
39 * Before cgram 1.294, the gcc_attribute was placed outside the pair of
40 * begin_type/end_type, exactly to resolve this conflict.
41 *
42 * Conceptually, it made sense to put the __attribute__((unused)) between
43 * begin_type and end_type, to make it part of the declaration-specifiers.
44 * This change introduced the hidden conflict though.
45 *
46 * Interestingly, the number of shift/reduce conflicts did not change in
47 * cgram 1.294, the conflicts were just resolved differently than before.
48 *
49 * To prevent this from happening again, make sure that declarations as well
50 * as statements can start with gcc_attribute.
51 */
52void
53ambiguity_for_attribute(void)
54{
55	/* expect+1: warning: 'var1' unused in function 'ambiguity_for_attribute' [192] */
56	__attribute__((unused)) _Bool var1;
57
58	switch (1) {
59	case 1:
60		println();
61		/* expect+1: warning: 'var2' unused in function 'ambiguity_for_attribute' [192] */
62		__attribute__((unused)) _Bool var2;
63		__attribute__((fallthrough));
64		case 2:
65			println();
66	}
67}
68
69void
70attribute_after_array_brackets(
71    const char *argv[] __attribute__((__unused__))
72)
73{
74}
75
76struct attribute_in_member_declaration {
77	int __attribute__(())
78	    x __attribute__(()),
79	    y __attribute__(());
80
81	unsigned int __attribute__(())
82/* FIXME */
83/* expect+1: error: syntax error ',' [249] */
84	    bit1:1 __attribute__(()),
85	    bit2:2 __attribute__(()),
86	    bit3:3 __attribute__(());
87};
88