1 // RUN: %clang_cc1 -x c++ -std=gnu++11 -fsyntax-only -pedantic -verify=ext,expected %s
2 // RUN: %clang_cc1 -x c -std=gnu11 -fsyntax-only -pedantic -verify=ext,expected %s
3 // RUN: %clang_cc1 -x c++ -std=c++23 -fsyntax-only -pedantic -verify=cxx23,expected -Wpre-c++23-compat %s
4 // RUN: %clang_cc1 -x c++ -std=gnu++11 -fwchar-type=short -fno-signed-wchar -fsyntax-only -pedantic -verify=ext,expected %s
5 // RUN: %clang_cc1 -x c -std=gnu11 -fwchar-type=short -fno-signed-wchar -fsyntax-only -pedantic -verify=ext,expected %s
6 // RUN: %clang_cc1 -x c++ -std=c++17 -ftrigraphs -fsyntax-only -pedantic -verify=ext,expected -DTRIGRAPHS=1 %s
9 "\u{}" // expected-error {{delimited escape sequence cannot be empty}}
10 "\u{" // expected-error {{expected '}'}}
11 "\u{h}" // expected-error {{invalid digit 'h' in escape sequence}}
12 "\x{}" // expected-error {{delimited escape sequence cannot be empty}}
13 "\x{" // expected-error {{expected '}'}}
14 "\x{h}" // expected-error {{invalid digit 'h' in escape sequence}}
15 "\o{}" // expected-error {{delimited escape sequence cannot be empty}}
16 "\o{" // expected-error {{expected '}'}}
17 "\o" // expected-error {{expected '{' after '\o' escape sequence}}
18 "\o{8}" // expected-error {{invalid digit '8' in escape sequence}}
19 "\U{8}" // expected-error {{\U used with no following hex digits}}
23 char a
= '\u{1234}'; // expected-error {{character too large for enclosing character literal type}} \
24 // ext-warning {{extension}} cxx23-warning {{C++23}}
26 unsigned b
= U
'\u{1234}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
29 unsigned b2
= U
'\u{1}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
31 unsigned b2
= U
'\u{1}'; //expected-error {{universal character name refers to a control character}}
34 unsigned c
= U
'\u{000000000001234}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
35 unsigned d
= U
'\u{111111111}'; //expected-error {{hex escape sequence out of range}}
39 char a
= '\x{1}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
40 char b
= '\x{abcdegggggabc}'; // expected-error 5{{invalid digit 'g' in escape sequence}}
41 char c
= '\x{ff1}'; // expected-error {{hex escape sequence out of range}}
43 #if __WCHAR_MAX__ > 0xFFFF
44 unsigned d
= L
'\x{FFFFFFFF}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
45 unsigned e
= L
'\x{100000000}'; // expected-error {{hex escape sequence out of range}}
47 unsigned f
= L
'\x{FFFF}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
48 unsigned g
= L
'\x{10000}'; // expected-error {{hex escape sequence out of range}}
50 unsigned h
= U
'\x{FFFFFFFF}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
51 unsigned i
= U
'\x{100000000}'; // expected-error {{hex escape sequence out of range}}
55 char a
= '\o{1}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
56 char b
= '\o{12345678881238}'; // expected-error 4{{invalid digit '8' in escape sequence}}
57 char c
= '\o{777}'; // //expected-error {{octal escape sequence out of range}}
58 #if __WCHAR_MAX__ > 0xFFFF
59 unsigned d
= L
'\o{37777777777}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
60 unsigned e
= L
'\o{40000000000}'; // expected-error {{octal escape sequence out of range}}
61 unsigned f
= L
'\o{100000000000}'; // expected-error {{octal escape sequence out of range}}
62 unsigned g
= L
'\o{200000000000}'; // expected-error {{octal escape sequence out of range}}
64 unsigned d
= L
'\o{177777}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
65 unsigned e
= L
'\o{200000}'; // expected-error {{octal escape sequence out of range}}
70 (void)"\x{" "12}"; // expected-error {{expected '}'}}
71 (void)"\u{" "12}"; // expected-error {{expected '}'}}
72 (void)"\o{" "12}"; // expected-error {{expected '}'}}
74 (void)"\x{12" "}"; // expected-error {{expected '}'}}
75 (void)"\u{12" "}"; // expected-error {{expected '}'}}
76 (void)"\o{12" "}"; // expected-error {{expected '}'}}
80 char a
= '\N{LOTUS}'; // expected-error{{character too large for enclosing character literal type}} \
81 // ext-warning {{extension}} cxx23-warning {{C++23}}
83 char b
= '\N{DOLLAR SIGN}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
84 char b_
= '\N{ DOL-LAR _SIGN }'; // expected-error {{' DOL-LAR _SIGN ' is not a valid Unicode character name}} \
85 // expected-note {{characters names in Unicode escape sequences are sensitive to case and whitespaces}}
87 char c
= '\N{NOTATHING}'; // expected-error {{'NOTATHING' is not a valid Unicode character name}} \
88 // expected-note 5{{did you mean}}
89 char d
= '\N{}'; // expected-error {{delimited escape sequence cannot be empty}}
90 char e
= '\N{'; // expected-error {{incomplete universal character name}}
92 unsigned f
= L
'\N{GREEK CAPITAL LETTER DELTA}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
94 unsigned g
= u
'\N{LOTUS}'; // expected-error {{character too large for enclosing character literal type}} \
95 // ext-warning {{extension}} cxx23-warning {{C++23}}
97 unsigned h
= U
'\N{LOTUS}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
98 unsigned i
= u
'\N{GREEK CAPITAL LETTER DELTA}'; // ext-warning {{extension}} cxx23-warning {{C++23}}
99 char j
= '\NN'; // expected-error {{expected '{' after '\N' escape sequence}} expected-warning {{multi-character character constant}}
100 unsigned k
= u
'\N{LOTUS'; // expected-error {{incomplete universal character name}}
102 const char* emoji
= "\N{🤡}"; // expected-error {{'🤡' is not a valid Unicode character name}} \
103 // expected-note 5{{did you mean}}
104 const char* nested
= "\N{\N{SPARKLE}}"; // expected-error {{'\N{SPARKLE' is not a valid Unicode character name}} \
105 // expected-note 5{{did you mean}}
108 void separators(void) {
109 (void)"\x{12'3}"; // expected-error {{invalid digit ''' in escape sequence}}
110 (void)"\u{12'3}"; // expected-error {{invalid digit ''' in escape sequence}}
111 (void)"\o{12'3}"; // expected-error {{invalid digit ''' in escape sequence}}
113 '\x{12'3'}'; // expected-error {{expected '}'}}
114 // expected-error@-1 2{{expected ';'}}
115 // expected-warning@-2 3{{expression result unused}}
118 #if L'\N
{GREEK CAPITAL LETTER GAMMA
}' != L'Γ
' // ext-warning {{extension}} cxx23-warning {{C++23}}
123 static_assert('\N
??<DOLLAR SIGN
??>' == '$
'); // expected-warning 2{{trigraph converted}} \
124 // ext-warning {{extension}} cxx23-warning {{C++23}}
127 void GH102218(void) {
128 // The format specifier checking code runs the lexer with diagnostics
129 // disabled. This used to crash Clang for malformed \o and \x because the
130 // lexer missed a null pointer check for the diagnostics engine in that case.
131 extern int printf(const char *, ...);
132 printf("\o{}"); // expected-error {{delimited escape sequence cannot be empty}}
133 printf("\x{}"); // expected-error {{delimited escape sequence cannot be empty}}
135 // These cases always worked but are here for completeness.
136 printf("\u{}"); // expected-error {{delimited escape sequence cannot be empty}}
137 printf("\N{}"); // expected-error {{delimited escape sequence cannot be empty}}