decl.c revision 1.3 1 1.3 rillig /* $NetBSD: decl.c,v 1.3 2021/07/11 12:12:30 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.3 rillig void
91 1.3 rillig unused_local_variable(void)
92 1.3 rillig {
93 1.3 rillig /*FIXME*//* expect+1: syntax error '_Bool' [249] */
94 1.3 rillig __attribute__((unused)) _Bool unused_var;
95 1.3 rillig
96 1.3 rillig __attribute__((unused))
97 1.3 rillig /*FIXME*//* expect+2: syntax error '__attribute__' [249] */
98 1.3 rillig /*FIXME*//* expect+1: cannot recover from previous errors [224] */
99 1.3 rillig __attribute__((unused)) _Bool unused_twice;
100 1.3 rillig }
101