[PATCH] D138861: [Clang] Implement CWG2640 Allow more characters in an n-char sequence
Corentin Jabot via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 28 13:46:28 PST 2022
cor3ntin created this revision.
Herald added a project: All.
cor3ntin requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D138861
Files:
clang/lib/Lex/Lexer.cpp
clang/lib/Lex/LiteralSupport.cpp
clang/test/CXX/drs/dr26xx.cpp
clang/test/Lexer/char-escapes-delimited.c
clang/test/Preprocessor/ucn-pp-identifier.c
Index: clang/test/Preprocessor/ucn-pp-identifier.c
===================================================================
--- clang/test/Preprocessor/ucn-pp-identifier.c
+++ 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 at -1 {{incomplete delimited universal character name; treating as '\' 'N' '{' identifier}}
+// expected-error at -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??<GREEK CAPITAL LETTER ALPHA??> = 0; // expected-warning{{extension}} cxx2b-warning {{before C++2b}} \
Index: clang/test/Lexer/char-escapes-delimited.c
===================================================================
--- clang/test/Lexer/char-escapes-delimited.c
+++ 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) {
Index: clang/test/CXX/drs/dr26xx.cpp
===================================================================
--- clang/test/CXX/drs/dr26xx.cpp
+++ 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}}
+
+}
Index: clang/lib/Lex/LiteralSupport.cpp
===================================================================
--- clang/lib/Lex/LiteralSupport.cpp
+++ 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) {
Index: clang/lib/Lex/Lexer.cpp
===================================================================
--- clang/lib/Lex/Lexer.cpp
+++ 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);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138861.478359.patch
Type: text/x-patch
Size: 5288 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221128/438787b2/attachment-0001.bin>
More information about the cfe-commits
mailing list