diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -3335,7 +3335,7 @@ break; } - if (!isAlphanumeric(C) && C != '_' && C != '-' && C != ' ') + if (C == '\n' || C == '\r') break; Buffer.push_back(C); } diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -548,11 +548,10 @@ return false; } ThisTokBuf++; - const char *ClosingBrace = - std::find_if_not(ThisTokBuf, ThisTokEnd, [](char C) { - return llvm::isAlnum(C) || llvm::isSpace(C) || C == '_' || C == '-'; - }); - bool Incomplete = ClosingBrace == ThisTokEnd || *ClosingBrace != '}'; + const char *ClosingBrace = std::find_if(ThisTokBuf, ThisTokEnd, [](char C) { + return C == '}' || C == '\n' || C == '\r'; + }); + bool Incomplete = ClosingBrace == ThisTokEnd; bool Empty = ClosingBrace == ThisTokBuf; if (Incomplete || Empty) { if (Diags) { diff --git a/clang/test/CXX/drs/dr26xx.cpp b/clang/test/CXX/drs/dr26xx.cpp --- a/clang/test/CXX/drs/dr26xx.cpp +++ b/clang/test/CXX/drs/dr26xx.cpp @@ -28,3 +28,12 @@ } } + +namespace dr2640 { // dr2640: yes + +int \N{Λ} = 0; //expected-error {{'Λ' is not a valid Unicode character name}} \ + //expected-error 2{{expected unqualified-id}} +const char* emoji = "\N{🤡}"; // expected-error {{'🤡' is not a valid Unicode character name}} \ + // expected-note 5{{did you mean}} + +} diff --git a/clang/test/Lexer/char-escapes-delimited.c b/clang/test/Lexer/char-escapes-delimited.c --- a/clang/test/Lexer/char-escapes-delimited.c +++ b/clang/test/Lexer/char-escapes-delimited.c @@ -96,6 +96,11 @@ unsigned i = u'\N{GREEK CAPITAL LETTER DELTA}'; // ext-warning {{extension}} cxx2b-warning {{C++2b}} char j = '\NN'; // expected-error {{expected '{' after '\N' escape sequence}} expected-warning {{multi-character character constant}} unsigned k = u'\N{LOTUS'; // expected-error {{incomplete universal character name}} + + const char* emoji = "\N{🤡}"; // expected-error {{'🤡' is not a valid Unicode character name}} \ + // expected-note 5{{did you mean}} + const char* nested = "\N{\N{SPARKLE}}"; // expected-error {{'\N{SPARKLE' is not a valid Unicode character name}} \ + // expected-note 5{{did you mean}} } void separators(void) { diff --git a/clang/test/Preprocessor/ucn-pp-identifier.c b/clang/test/Preprocessor/ucn-pp-identifier.c --- a/clang/test/Preprocessor/ucn-pp-identifier.c +++ b/clang/test/Preprocessor/ucn-pp-identifier.c @@ -121,17 +121,20 @@ #define \u{123456789} // expected-error {{hex escape sequence out of range}} expected-error {{macro name must be an identifier}} #define \u{ // expected-warning {{incomplete delimited universal character name; treating as '\' 'u' '{' identifier}} expected-error {{macro name must be an identifier}} #define \u{fgh} // expected-warning {{incomplete delimited universal character name; treating as '\' 'u' '{' identifier}} expected-error {{macro name must be an identifier}} -#define \N{ // expected-warning {{incomplete delimited universal character name; treating as '\' 'N' '{' identifier}} expected-error {{macro name must be an identifier}} +#define \N{ +// expected-warning@-1 {{incomplete delimited universal character name; treating as '\' 'N' '{' identifier}} +// expected-error@-2 {{macro name must be an identifier}} #define \N{} // expected-warning {{empty delimited universal character name; treating as '\' 'N' '{' '}'}} expected-error {{macro name must be an identifier}} #define \N{NOTATHING} // expected-error {{'NOTATHING' is not a valid Unicode character name}} \ // expected-error {{macro name must be an identifier}} #define \NN // expected-warning {{incomplete universal character name; treating as '\' followed by identifier}} expected-error {{macro name must be an identifier}} #define \N{GREEK_SMALL-LETTERALPHA} // expected-error {{'GREEK_SMALL-LETTERALPHA' is not a valid Unicode character name}} \ // expected-note {{characters names in Unicode escape sequences are sensitive to case and whitespaces}} - +#define \N{🤡} // expected-error {{'🤡' is not a valid Unicode character name}} \ + // expected-error {{macro name must be an identifier}} #define CONCAT(A, B) A##B -int CONCAT(\N{GREEK, CAPITALLETTERALPHA}); // expected-error{{expected}} \ - // expected-warning {{incomplete delimited universal character name}} +int CONCAT(\N{GREEK, CAPITALLETTERALPHA}); // expected-error{{'GREEK, CAPITALLETTERALPHA' is not a valid Unicode character name}} \ + // expected-error{{expected}} #ifdef TRIGRAPHS int \N?? = 0; // expected-warning{{extension}} cxx2b-warning {{before C++2b}} \