| @@ -1,88 +1,100 @@ | | | @@ -1,88 +1,100 @@ |
1 | /* $NetBSD: decl.c,v 1.2 2021/07/10 19:30:19 rillig Exp $ */ | | 1 | /* $NetBSD: decl.c,v 1.3 2021/07/11 12:12:30 rillig Exp $ */ |
2 | # 3 "decl.c" | | 2 | # 3 "decl.c" |
3 | | | 3 | |
4 | /* | | 4 | /* |
5 | * Tests for declarations, especially the distinction between the | | 5 | * Tests for declarations, especially the distinction between the |
6 | * declaration-specifiers and the declarators. | | 6 | * declaration-specifiers and the declarators. |
7 | */ | | 7 | */ |
8 | | | 8 | |
9 | /* | | 9 | /* |
10 | * Even though 'const' comes after 'char' and is therefore quite close to the | | 10 | * Even though 'const' comes after 'char' and is therefore quite close to the |
11 | * first identifier, it applies to both identifiers. | | 11 | * first identifier, it applies to both identifiers. |
12 | */ | | 12 | */ |
13 | void | | 13 | void |
14 | specifier_qualifier(void) | | 14 | specifier_qualifier(void) |
15 | { | | 15 | { |
16 | char const a = 1, b = 2; | | 16 | char const a = 1, b = 2; |
17 | | | 17 | |
18 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ | | 18 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ |
19 | a = 1; | | 19 | a = 1; |
20 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ | | 20 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ |
21 | b = 2; | | 21 | b = 2; |
22 | } | | 22 | } |
23 | | | 23 | |
24 | /* | | 24 | /* |
25 | * Since 'const' comes before 'char', there is no ambiguity whether the | | 25 | * Since 'const' comes before 'char', there is no ambiguity whether the |
26 | * 'const' applies to all variables or just to the first. | | 26 | * 'const' applies to all variables or just to the first. |
27 | */ | | 27 | */ |
28 | void | | 28 | void |
29 | qualifier_specifier(void) | | 29 | qualifier_specifier(void) |
30 | { | | 30 | { |
31 | const char a = 1, b = 2; | | 31 | const char a = 1, b = 2; |
32 | | | 32 | |
33 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ | | 33 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ |
34 | a = 3; | | 34 | a = 3; |
35 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ | | 35 | /* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */ |
36 | b = 5; | | 36 | b = 5; |
37 | } | | 37 | } |
38 | | | 38 | |
39 | void | | 39 | void |
40 | declarator_with_prefix_qualifier(void) | | 40 | declarator_with_prefix_qualifier(void) |
41 | { | | 41 | { |
42 | /* expect+1: syntax error 'const' [249] */ | | 42 | /* expect+1: syntax error 'const' [249] */ |
43 | char a = 1, const b = 2; | | 43 | char a = 1, const b = 2; |
44 | | | 44 | |
45 | a = 1; | | 45 | a = 1; |
46 | /* expect+1: error: 'b' undefined [99] */ | | 46 | /* expect+1: error: 'b' undefined [99] */ |
47 | b = 2; | | 47 | b = 2; |
48 | } | | 48 | } |
49 | | | 49 | |
50 | void | | 50 | void |
51 | declarator_with_postfix_qualifier(void) | | 51 | declarator_with_postfix_qualifier(void) |
52 | { | | 52 | { |
53 | /* expect+1: syntax error 'const' [249] */ | | 53 | /* expect+1: syntax error 'const' [249] */ |
54 | char a = 1, b const = 2; | | 54 | char a = 1, b const = 2; |
55 | | | 55 | |
56 | a = 1; | | 56 | a = 1; |
57 | b = 2; | | 57 | b = 2; |
58 | } | | 58 | } |
59 | | | 59 | |
60 | void sink(double *); | | 60 | void sink(double *); |
61 | | | 61 | |
62 | void | | 62 | void |
63 | declarators(void) | | 63 | declarators(void) |
64 | { | | 64 | { |
65 | char *pc = 0, c = 0, **ppc = 0; | | 65 | char *pc = 0, c = 0, **ppc = 0; |
66 | | | 66 | |
67 | /* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' */ | | 67 | /* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' */ |
68 | sink(pc); | | 68 | sink(pc); |
69 | /* expect+1: warning: illegal combination of pointer (pointer to double) and integer (char) */ | | 69 | /* expect+1: warning: illegal combination of pointer (pointer to double) and integer (char) */ |
70 | sink(c); | | 70 | sink(c); |
71 | /* expect+1: converting 'pointer to pointer to char' to incompatible 'pointer to double' */ | | 71 | /* expect+1: converting 'pointer to pointer to char' to incompatible 'pointer to double' */ |
72 | sink(ppc); | | 72 | sink(ppc); |
73 | } | | 73 | } |
74 | | | 74 | |
75 | _Bool | | 75 | _Bool |
76 | enum_error_handling(void) | | 76 | enum_error_handling(void) |
77 | { | | 77 | { |
78 | enum { | | 78 | enum { |
79 | /* expect+1: syntax error '"' [249] */ | | 79 | /* expect+1: syntax error '"' [249] */ |
80 | "error 1" | | 80 | "error 1" |
81 | : /* still the same error */ | | 81 | : /* still the same error */ |
82 | , /* back on track */ | | 82 | , /* back on track */ |
83 | A, | | 83 | A, |
84 | B | | 84 | B |
85 | } x = A; | | 85 | } x = A; |
86 | | | 86 | |
87 | return x == B; | | 87 | return x == B; |
88 | } | | 88 | } |
| | | 89 | |
| | | 90 | void |
| | | 91 | unused_local_variable(void) |
| | | 92 | { |
| | | 93 | /*FIXME*//* expect+1: syntax error '_Bool' [249] */ |
| | | 94 | __attribute__((unused)) _Bool unused_var; |
| | | 95 | |
| | | 96 | __attribute__((unused)) |
| | | 97 | /*FIXME*//* expect+2: syntax error '__attribute__' [249] */ |
| | | 98 | /*FIXME*//* expect+1: cannot recover from previous errors [224] */ |
| | | 99 | __attribute__((unused)) _Bool unused_twice; |
| | | 100 | } |