140 lines · c
1// RUN: %clang_cc1 -std=c23 %s -E -verify2 3// Test the parsing behavior for #embed and all of its parameters to ensure we4// recover from failures gracefully.5char buffer[] = {6#embed7// 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.txt18// expected-error@-1{{expected "FILENAME" or <FILENAME>}}19 20#embed "embed_parsing_errors.c" xxx21// 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::xxx27// expected-error@-1 {{unknown embed preprocessor parameter 'xxx::xxx'}}28 29#embed "embed_parsing_errors.c" xxx::4230// expected-error@-1 {{expected identifier}}31 32#embed "embed_parsing_errors.c" limit33// 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(xxx39// expected-error@-1 {{expected ')'}}40 41#embed "embed_parsing_errors.c" limit(4242// 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::offset54// 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(xxx60// expected-error@-1 {{expected ')'}}61 62#embed "embed_parsing_errors.c" clang::offset(4263// 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 4275// expected-error@-1 {{expected '('}}76 77#embed "embed_parsing_errors.c" prefix78// 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(xxx84// 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 balanced88#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 optional95#embed "embed_parsing_errors.c" prefix)96// expected-error@-1 {{expected '('}}97#embed "embed_parsing_errors.c" prefix()) // expected-error {{expected identifier}}98#embed "embed_parsing_errors.c" prefix(]) // expected-error {{expected ')'}}99#embed "embed_parsing_errors.c" prefix(}) // expected-error {{expected ')'}}100 101#embed "embed_parsing_errors.c" suffix102// expected-error@-1 {{expected '('}}103 104#embed "embed_parsing_errors.c" suffix(105// expected-error@-1 {{expected ')'}}106 107#embed "embed_parsing_errors.c" suffix(xxx108// expected-error@-1 {{expected ')'}}109 110#embed "embed_parsing_errors.c" suffix(1/0) // OK: emitted as tokens, not evaluated yet.111#embed "embed_parsing_errors.c" suffix(([{}])) // OK: delimiters balanced112#embed "embed_parsing_errors.c" suffix(([{)]})113// expected-error@-1 {{expected '}'}} expected-note@-1 {{to match this '{'}}114#embed "embed_parsing_errors.c" suffix(([{})})115// expected-error@-1 {{expected ']'}} expected-note@-1 {{to match this '['}}116#embed "embed_parsing_errors.c" suffix(([{}]})117// expected-error@-1 {{expected ')'}} expected-note@-1 {{to match this '('}}118#embed "embed_parsing_errors.c" suffix() // OK: tokens within parens are optional119#embed "embed_parsing_errors.c" suffix)120// expected-error@-1 {{expected '('}}121#embed "embed_parsing_errors.c" suffix()) // expected-error {{expected identifier}}122#embed "embed_parsing_errors.c" suffix(]) // expected-error {{expected ')'}}123#embed "embed_parsing_errors.c" suffix(}) // expected-error {{expected ')'}}124 125#embed "embed_parsing_errors.c" if_empty(1/0) // OK: emitted as tokens, not evaluated yet.126#embed "embed_parsing_errors.c" if_empty(([{}])) // OK: delimiters balanced127#embed "embed_parsing_errors.c" if_empty(([{)]})128// expected-error@-1 {{expected '}'}} expected-note@-1 {{to match this '{'}}129#embed "embed_parsing_errors.c" if_empty(([{})})130// expected-error@-1 {{expected ']'}} expected-note@-1 {{to match this '['}}131#embed "embed_parsing_errors.c" if_empty(([{}]})132// expected-error@-1 {{expected ')'}} expected-note@-1 {{to match this '('}}133#embed "embed_parsing_errors.c" if_empty() // OK: tokens within parens are optional134#embed "embed_parsing_errors.c" if_empty)135// expected-error@-1 {{expected '('}}136};137#embed "embed_parsing_errors.c" if_empty()) // expected-error {{expected identifier}}138#embed "embed_parsing_errors.c" if_empty(]) // expected-error {{expected ')'}}139#embed "embed_parsing_errors.c" if_empty(}) // expected-error {{expected ')'}}140