decl.c revision 1.6 1 1.6 rillig /* $NetBSD: decl.c,v 1.6 2021/07/15 21:00:05 rillig Exp $ */
2 1.1 rillig # 3 "decl.c"
3 1.1 rillig
4 1.1 rillig /*
5 1.1 rillig * Tests for declarations, especially the distinction between the
6 1.1 rillig * declaration-specifiers and the declarators.
7 1.1 rillig */
8 1.1 rillig
9 1.1 rillig /*
10 1.1 rillig * Even though 'const' comes after 'char' and is therefore quite close to the
11 1.1 rillig * first identifier, it applies to both identifiers.
12 1.1 rillig */
13 1.1 rillig void
14 1.1 rillig specifier_qualifier(void)
15 1.1 rillig {
16 1.1 rillig char const a = 1, b = 2;
17 1.1 rillig
18 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
19 1.1 rillig a = 1;
20 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
21 1.1 rillig b = 2;
22 1.1 rillig }
23 1.1 rillig
24 1.1 rillig /*
25 1.1 rillig * Since 'const' comes before 'char', there is no ambiguity whether the
26 1.1 rillig * 'const' applies to all variables or just to the first.
27 1.1 rillig */
28 1.1 rillig void
29 1.1 rillig qualifier_specifier(void)
30 1.1 rillig {
31 1.1 rillig const char a = 1, b = 2;
32 1.1 rillig
33 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
34 1.1 rillig a = 3;
35 1.1 rillig /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
36 1.1 rillig b = 5;
37 1.1 rillig }
38 1.1 rillig
39 1.1 rillig void
40 1.1 rillig declarator_with_prefix_qualifier(void)
41 1.1 rillig {
42 1.1 rillig /* expect+1: syntax error 'const' [249] */
43 1.1 rillig char a = 1, const b = 2;
44 1.1 rillig
45 1.1 rillig a = 1;
46 1.1 rillig /* expect+1: error: 'b' undefined [99] */
47 1.1 rillig b = 2;
48 1.1 rillig }
49 1.1 rillig
50 1.1 rillig void
51 1.1 rillig declarator_with_postfix_qualifier(void)
52 1.1 rillig {
53 1.1 rillig /* expect+1: syntax error 'const' [249] */
54 1.1 rillig char a = 1, b const = 2;
55 1.1 rillig
56 1.1 rillig a = 1;
57 1.1 rillig b = 2;
58 1.1 rillig }
59 1.1 rillig
60 1.1 rillig void sink(double *);
61 1.1 rillig
62 1.1 rillig void
63 1.1 rillig declarators(void)
64 1.1 rillig {
65 1.1 rillig char *pc = 0, c = 0, **ppc = 0;
66 1.1 rillig
67 1.1 rillig /* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' */
68 1.1 rillig sink(pc);
69 1.1 rillig /* expect+1: warning: illegal combination of pointer (pointer to double) and integer (char) */
70 1.1 rillig sink(c);
71 1.1 rillig /* expect+1: converting 'pointer to pointer to char' to incompatible 'pointer to double' */
72 1.1 rillig sink(ppc);
73 1.1 rillig }
74 1.2 rillig
75 1.2 rillig _Bool
76 1.2 rillig enum_error_handling(void)
77 1.2 rillig {
78 1.2 rillig enum {
79 1.2 rillig /* expect+1: syntax error '"' [249] */
80 1.2 rillig "error 1"
81 1.2 rillig : /* still the same error */
82 1.2 rillig , /* back on track */
83 1.2 rillig A,
84 1.2 rillig B
85 1.2 rillig } x = A;
86 1.2 rillig
87 1.2 rillig return x == B;
88 1.2 rillig }
89 1.3 rillig
90 1.4 rillig /*
91 1.4 rillig * An __attribute__ at the beginning of a declaration may become ambiguous
92 1.4 rillig * since a GCC fallthrough statement starts with __attribute__ as well.
93 1.4 rillig */
94 1.3 rillig void
95 1.3 rillig unused_local_variable(void)
96 1.3 rillig {
97 1.3 rillig __attribute__((unused)) _Bool unused_var;
98 1.3 rillig
99 1.3 rillig __attribute__((unused))
100 1.3 rillig __attribute__((unused)) _Bool unused_twice;
101 1.3 rillig }
102 1.5 rillig
103 1.5 rillig int
104 1.5 rillig declaration_without_type_specifier(void)
105 1.5 rillig {
106 1.5 rillig const i = 3;
107 1.5 rillig
108 1.5 rillig return i;
109 1.5 rillig }
110 1.5 rillig
111 1.5 rillig /* TODO: add quotes around %s */
112 1.5 rillig /* expect+2: warning: static function unused unused [236] */
113 1.5 rillig static void
114 1.5 rillig unused(void)
115 1.5 rillig {
116 1.5 rillig }
117 1.5 rillig
118 1.5 rillig /*
119 1.5 rillig * The attribute 'used' does not influence static functions, it only
120 1.5 rillig * applies to function parameters.
121 1.5 rillig */
122 1.5 rillig /* LINTED */
123 1.5 rillig static void
124 1.5 rillig unused_linted(void)
125 1.5 rillig {
126 1.5 rillig }
127 1.6 rillig
128 1.6 rillig /* covers 'type_qualifier_list: type_qualifier_list type_qualifier' */
129 1.6 rillig int *const volatile cover_type_qualifier_list;
130