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