xref: /llvm-project/clang/test/Preprocessor/embed_parsing_errors.c (revision 41c6e4379204ffc00948edd33d59ba5ebbceaba2)
1 // RUN: %clang_cc1 -std=c23 %s -E -verify
2 
3 // Test the parsing behavior for #embed and all of its parameters to ensure we
4 // recover from failures gracefully.
5 char buffer[] = {
6 #embed
7 // expected-error@-1 {{expected "FILENAME" or <FILENAME>}}
8 
9 #embed <
10 // expected-error@-1 {{expected '>'}} \
11    expected-note@-1 {{to match this '<'}}
12 
13 #embed "
14 // expected-error@-1 {{expected "FILENAME" or <FILENAME>}} \
15    expected-warning@-1 {{missing terminating '"' character}}
16 
17 #embed file.txt
18 // expected-error@-1{{expected "FILENAME" or <FILENAME>}}
19 
20 #embed "embed_parsing_errors.c" xxx
21 // expected-error@-1 {{unknown embed preprocessor parameter 'xxx'}}
22 
23 #embed "embed_parsing_errors.c" xxx::
24 // expected-error@-1 {{expected identifier}}
25 
26 #embed "embed_parsing_errors.c" xxx::xxx
27 // expected-error@-1 {{unknown embed preprocessor parameter 'xxx::xxx'}}
28 
29 #embed "embed_parsing_errors.c" xxx::42
30 // expected-error@-1 {{expected identifier}}
31 
32 #embed "embed_parsing_errors.c" limit
33 // expected-error@-1 {{expected '('}}
34 
35 #embed "embed_parsing_errors.c" limit(
36 // expected-error@-1 {{expected value in expression}}
37 
38 #embed "embed_parsing_errors.c" limit(xxx
39 // expected-error@-1 {{expected ')'}}
40 
41 #embed "embed_parsing_errors.c" limit(42
42 // expected-error@-1 {{expected ')'}}
43 
44 #embed "embed_parsing_errors.c" limit([
45 // expected-error@-1 {{invalid token at start of a preprocessor expression}}
46 
47 #embed "embed_parsing_errors.c" limit([)
48 // expected-error@-1 {{invalid token at start of a preprocessor expression}}
49 
50 #embed "embed_parsing_errors.c" limit(1/0)
51 // expected-error@-1 {{division by zero in preprocessor expression}}
52 
53 #embed "embed_parsing_errors.c" clang::offset
54 // expected-error@-1 {{expected '('}}
55 
56 #embed "embed_parsing_errors.c" clang::offset(
57 // expected-error@-1 {{expected value in expression}}
58 
59 #embed "embed_parsing_errors.c" clang::offset(xxx
60 // expected-error@-1 {{expected ')'}}
61 
62 #embed "embed_parsing_errors.c" clang::offset(42
63 // expected-error@-1 {{expected ')'}}
64 
65 #embed "embed_parsing_errors.c" clang::offset([
66 // expected-error@-1 {{invalid token at start of a preprocessor expression}}
67 
68 #embed "embed_parsing_errors.c" clang::offset([)
69 // expected-error@-1 {{invalid token at start of a preprocessor expression}}
70 
71 #embed "embed_parsing_errors.c" clang::offset(1/0)
72 // expected-error@-1 {{division by zero in preprocessor expression}}
73 
74 #embed "embed_parsing_errors.c" clang::offset 42
75 // expected-error@-1 {{expected '('}}
76 
77 #embed "embed_parsing_errors.c" prefix
78 // expected-error@-1 {{expected '('}}
79 
80 #embed "embed_parsing_errors.c" prefix(
81 // expected-error@-1 {{expected ')'}}
82 
83 #embed "embed_parsing_errors.c" prefix(xxx
84 // expected-error@-1 {{expected ')'}}
85 
86 #embed "embed_parsing_errors.c" prefix(1/0) // OK: emitted as tokens, not evaluated yet.
87 #embed "embed_parsing_errors.c" prefix(([{}])) // OK: delimiters balanced
88 #embed "embed_parsing_errors.c" prefix(([{)]})
89 // expected-error@-1 {{expected '}'}} expected-note@-1 {{to match this '{'}}
90 #embed "embed_parsing_errors.c" prefix(([{})})
91 // expected-error@-1 {{expected ']'}} expected-note@-1 {{to match this '['}}
92 #embed "embed_parsing_errors.c" prefix(([{}]})
93 // expected-error@-1 {{expected ')'}} expected-note@-1 {{to match this '('}}
94 #embed "embed_parsing_errors.c" prefix() // OK: tokens within parens are optional
95 #embed "embed_parsing_errors.c" prefix)
96 // expected-error@-1 {{expected '('}}
97 
98 #embed "embed_parsing_errors.c" suffix
99 // expected-error@-1 {{expected '('}}
100 
101 #embed "embed_parsing_errors.c" suffix(
102 // expected-error@-1 {{expected ')'}}
103 
104 #embed "embed_parsing_errors.c" suffix(xxx
105 // expected-error@-1 {{expected ')'}}
106 
107 #embed "embed_parsing_errors.c" suffix(1/0) // OK: emitted as tokens, not evaluated yet.
108 #embed "embed_parsing_errors.c" suffix(([{}])) // OK: delimiters balanced
109 #embed "embed_parsing_errors.c" suffix(([{)]})
110 // expected-error@-1 {{expected '}'}} expected-note@-1 {{to match this '{'}}
111 #embed "embed_parsing_errors.c" suffix(([{})})
112 // expected-error@-1 {{expected ']'}} expected-note@-1 {{to match this '['}}
113 #embed "embed_parsing_errors.c" suffix(([{}]})
114 // expected-error@-1 {{expected ')'}} expected-note@-1 {{to match this '('}}
115 #embed "embed_parsing_errors.c" suffix() // OK: tokens within parens are optional
116 #embed "embed_parsing_errors.c" suffix)
117 // expected-error@-1 {{expected '('}}
118 
119 #embed "embed_parsing_errors.c" if_empty(1/0) // OK: emitted as tokens, not evaluated yet.
120 #embed "embed_parsing_errors.c" if_empty(([{}])) // OK: delimiters balanced
121 #embed "embed_parsing_errors.c" if_empty(([{)]})
122 // expected-error@-1 {{expected '}'}} expected-note@-1 {{to match this '{'}}
123 #embed "embed_parsing_errors.c" if_empty(([{})})
124 // expected-error@-1 {{expected ']'}} expected-note@-1 {{to match this '['}}
125 #embed "embed_parsing_errors.c" if_empty(([{}]})
126 // expected-error@-1 {{expected ')'}} expected-note@-1 {{to match this '('}}
127 #embed "embed_parsing_errors.c" if_empty() // OK: tokens within parens are optional
128 #embed "embed_parsing_errors.c" if_empty)
129 // expected-error@-1 {{expected '('}}
130 };
131