1*44eee659SZhihao Yuan // RUN: %clang_cc1 -std=c++20 -fsyntax-only -ast-print %s | FileCheck %s
2*44eee659SZhihao Yuan
3*44eee659SZhihao Yuan using size_t = __SIZE_TYPE__;
4*44eee659SZhihao Yuan static_assert(__has_builtin(__make_integer_seq));
5*44eee659SZhihao Yuan
6*44eee659SZhihao Yuan template <class T, T... I> class idx_seq {};
7*44eee659SZhihao Yuan template <size_t N> using make_idx_seq = __make_integer_seq<idx_seq, size_t, N>;
8*44eee659SZhihao Yuan
9*44eee659SZhihao Yuan template <class CharT, size_t N>
10*44eee659SZhihao Yuan struct Str {
StrStr11*44eee659SZhihao Yuan constexpr Str(CharT const (&s)[N]) : Str(s, make_idx_seq<N>()) {}
12*44eee659SZhihao Yuan CharT value[N];
13*44eee659SZhihao Yuan
14*44eee659SZhihao Yuan private:
15*44eee659SZhihao Yuan template <size_t... I>
StrStr16*44eee659SZhihao Yuan constexpr Str(CharT const (&s)[N], idx_seq<size_t, I...>) : value{s[I]...} {}
17*44eee659SZhihao Yuan };
18*44eee659SZhihao Yuan
19*44eee659SZhihao Yuan template <Str> class ASCII {};
20*44eee659SZhihao Yuan
not_string()21*44eee659SZhihao Yuan void not_string() {
22*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{9, -1, 42}}>
23*44eee659SZhihao Yuan new ASCII<(int[]){9, -1, 42}>;
24*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{3.140000e+00, 0.000000e+00, 4.200000e+01}}>
25*44eee659SZhihao Yuan new ASCII<(double[]){3.14, 0., 42.}>;
26*44eee659SZhihao Yuan }
27*44eee659SZhihao Yuan
narrow()28*44eee659SZhihao Yuan void narrow() {
29*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{""}>
30*44eee659SZhihao Yuan new ASCII<"">;
31*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"the quick brown fox jumps"}>
32*44eee659SZhihao Yuan new ASCII<"the quick brown fox jumps">;
33*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"OVER THE LAZY DOG 0123456789"}>
34*44eee659SZhihao Yuan new ASCII<"OVER THE LAZY DOG 0123456789">;
35*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"\\`~!@#$%^&*()_+-={}[]|\'\";:,.<>?/"}>
36*44eee659SZhihao Yuan new ASCII<R"(\`~!@#$%^&*()_+-={}[]|'";:,.<>?/)">;
37*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{101, 115, 99, 97, 112, 101, 0, 0}}>
38*44eee659SZhihao Yuan new ASCII<"escape\0">;
39*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"escape\r\n"}>
40*44eee659SZhihao Yuan new ASCII<"escape\r\n">;
41*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"escape\\\t\f\v"}>
42*44eee659SZhihao Yuan new ASCII<"escape\\\t\f\v">;
43*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"escape\a\bc"}>
44*44eee659SZhihao Yuan new ASCII<"escape\a\b\c">;
45*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{110, 111, 116, 17, 0}}>
46*44eee659SZhihao Yuan new ASCII<"not\x11">;
47*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{18, 20, 127, 16, 1, 32, 97, 98, 99, 0}}>
48*44eee659SZhihao Yuan new ASCII<"\x12\x14\x7f\x10\x01 abc">;
49*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{18, 20, 127, 16, 1, 32, 97, 98, 99, 100, 0}}>
50*44eee659SZhihao Yuan new ASCII<"\x12\x14\x7f\x10\x01 abcd">;
51*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"print more characters as string"}>
52*44eee659SZhihao Yuan new ASCII<"print more characters as string">;
53*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{"print more characters as string, no uplimit"}>
54*44eee659SZhihao Yuan new ASCII<"print more characters as string, no uplimit">;
55*44eee659SZhihao Yuan }
56*44eee659SZhihao Yuan
57*44eee659SZhihao Yuan void wide() {
58*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L""}>
59*44eee659SZhihao Yuan new ASCII<L"">;
60*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"the quick brown fox jumps"}>
61*44eee659SZhihao Yuan new ASCII<L"the quick brown fox jumps">;
62*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"OVER THE LAZY DOG 0123456789"}>
63*44eee659SZhihao Yuan new ASCII<L"OVER THE LAZY DOG 0123456789">;
64*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"\\`~!@#$%^&*()_+-={}[]|\'\";:,.<>?/"}>
65*44eee659SZhihao Yuan new ASCII<LR"(\`~!@#$%^&*()_+-={}[]|'";:,.<>?/)">;
66*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{101, 115, 99, 97, 112, 101, 0, 0}}>
67*44eee659SZhihao Yuan new ASCII<L"escape\0">;
68*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"escape\r\n"}>
69*44eee659SZhihao Yuan new ASCII<L"escape\r\n">;
70*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"escape\\\t\f\v"}>
71*44eee659SZhihao Yuan new ASCII<L"escape\\\t\f\v">;
72*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"escape\a\bc"}>
73*44eee659SZhihao Yuan new ASCII<L"escape\a\b\c">;
74*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{110, 111, 116, 17, 0}}>
75*44eee659SZhihao Yuan new ASCII<L"not\x11">;
76*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{18, 20, 255, 22909, 136, 32, 97, 98, 99, 0}}>
77*44eee659SZhihao Yuan new ASCII<L"\x12\x14\xff\x597d\x88 abc">;
78*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{18, 20, 255, 22909, 136, 32, 97, 98, 99, 100, 0}}>
79*44eee659SZhihao Yuan new ASCII<L"\x12\x14\xff\x597d\x88 abcd">;
80*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"print more characters as string"}>
81*44eee659SZhihao Yuan new ASCII<L"print more characters as string">;
82*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{L"print more characters as string, no uplimit"}>
83*44eee659SZhihao Yuan new ASCII<L"print more characters as string, no uplimit">;
84*44eee659SZhihao Yuan }
85*44eee659SZhihao Yuan
utf8()86*44eee659SZhihao Yuan void utf8() {
87*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u8""}>
88*44eee659SZhihao Yuan new ASCII<u8"">;
89*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u8"\\`~!@#$%^&*()_+-={}[]|\'\";:,.<>?/"}>
90*44eee659SZhihao Yuan new ASCII<u8R"(\`~!@#$%^&*()_+-={}[]|'";:,.<>?/)">;
91*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{101, 115, 99, 97, 112, 101, 0, 0}}>
92*44eee659SZhihao Yuan new ASCII<u8"escape\0">;
93*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u8"escape\r\n"}>
94*44eee659SZhihao Yuan new ASCII<u8"escape\r\n">;
95*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{229, 165, 189, 239, 191, 189, 0}}>
96*44eee659SZhihao Yuan new ASCII<u8"\u597d\ufffd">;
97*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u8"print more characters as string, no uplimit"}>
98*44eee659SZhihao Yuan new ASCII<u8"print more characters as string, no uplimit">;
99*44eee659SZhihao Yuan }
100*44eee659SZhihao Yuan
101*44eee659SZhihao Yuan void utf16() {
102*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u""}>
103*44eee659SZhihao Yuan new ASCII<u"">;
104*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u"\\`~!@#$%^&*()_+-={}[]|\'\";:,.<>?/"}>
105*44eee659SZhihao Yuan new ASCII<uR"(\`~!@#$%^&*()_+-={}[]|'";:,.<>?/)">;
106*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{101, 115, 99, 97, 112, 101, 0, 0}}>
107*44eee659SZhihao Yuan new ASCII<u"escape\0">;
108*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u"escape\r\n"}>
109*44eee659SZhihao Yuan new ASCII<u"escape\r\n">;
110*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{22909, 65533, 0}}>
111*44eee659SZhihao Yuan new ASCII<u"\u597d\ufffd">;
112*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{u"print more characters as string, no uplimit"}>
113*44eee659SZhihao Yuan new ASCII<u"print more characters as string, no uplimit">;
114*44eee659SZhihao Yuan }
115*44eee659SZhihao Yuan
utf32()116*44eee659SZhihao Yuan void utf32() {
117*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{U""}>
118*44eee659SZhihao Yuan new ASCII<U"">;
119*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{U"\\`~!@#$%^&*()_+-={}[]|\'\";:,.<>?/"}>
120*44eee659SZhihao Yuan new ASCII<UR"(\`~!@#$%^&*()_+-={}[]|'";:,.<>?/)">;
121*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{101, 115, 99, 97, 112, 101, 0, 0}}>
122*44eee659SZhihao Yuan new ASCII<U"escape\0">;
123*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{U"escape\r\n"}>
124*44eee659SZhihao Yuan new ASCII<U"escape\r\n">;
125*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{{22909, 131358, 0}}>
126*44eee659SZhihao Yuan new ASCII<U"\u597d\U0002011E">;
127*44eee659SZhihao Yuan // CHECK{LITERAL}: ASCII<{U"print more characters as string, no uplimit"}>
128*44eee659SZhihao Yuan new ASCII<U"print more characters as string, no uplimit">;
129*44eee659SZhihao Yuan }
130