1 | // RUN: %check_clang_tidy %s modernize-raw-string-literal %t -- -config="{CheckOptions: {modernize-raw-string-literal.ReplaceShorterLiterals: true}}" |
---|---|
2 | |
3 | char const *const BackSlash("goink\\frob"); |
4 | // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: escaped string literal can be written as a raw string literal [modernize-raw-string-literal] |
5 | // CHECK-FIXES: {{^}}char const *const BackSlash(R"(goink\frob)");{{$}} |
6 | |
7 | char const *const PlainLiteral("plain literal"); |
8 | |
9 | // Non-printable ASCII characters. |
10 | char const *const Nul("goink\\\000"); |
11 | char const *const Soh("goink\\\001"); |
12 | char const *const Stx("goink\\\002"); |
13 | char const *const Etx("goink\\\003"); |
14 | char const *const Enq("goink\\\004"); |
15 | char const *const Ack("goink\\\005"); |
16 | char const *const Bell("goink\\\afrob"); |
17 | char const *const BackSpace("goink\\\bfrob"); |
18 | char const *const HorizontalTab("goink\\\tfrob"); |
19 | char const *const NewLine("goink\nfrob"); |
20 | char const *const VerticalTab("goink\\\vfrob"); |
21 | char const *const FormFeed("goink\\\ffrob"); |
22 | char const *const CarraigeReturn("goink\\\rfrob"); |
23 | char const *const So("goink\\\016"); |
24 | char const *const Si("goink\\\017"); |
25 | char const *const Dle("goink\\\020"); |
26 | char const *const Dc1("goink\\\021"); |
27 | char const *const Dc2("goink\\\022"); |
28 | char const *const Dc3("goink\\\023"); |
29 | char const *const Dc4("goink\\\024"); |
30 | char const *const Nak("goink\\\025"); |
31 | char const *const Syn("goink\\\026"); |
32 | char const *const Etb("goink\\\027"); |
33 | char const *const Can("goink\\\030"); |
34 | char const *const Em("goink\\\031"); |
35 | char const *const Sub("goink\\\032"); |
36 | char const *const Esc("goink\\\033"); |
37 | char const *const Fs("goink\\\034"); |
38 | char const *const Gs("goink\\\035"); |
39 | char const *const Rs("goink\\\036"); |
40 | char const *const Us("goink\\\037"); |
41 | char const *const HexNonPrintable("\\\x03"); |
42 | char const *const Delete("\\\177"); |
43 | char const *const MultibyteSnowman("\xE2\x98\x83"); |
44 | // CHECK-FIXES: {{^}}char const *const MultibyteSnowman("\xE2\x98\x83");{{$}} |
45 | |
46 | char const *const TrailingSpace("A line \\with space. \n"); |
47 | char const *const TrailingNewLine("A single \\line.\n"); |
48 | char const *const AlreadyRaw(R"(foobie\\bletch)"); |
49 | auto const *const UTF8Literal(u8"foobie\\bletch"); |
50 | auto const *const UTF8RawLiteral(u8R"(foobie\\bletch)"); |
51 | // TODO: enable these tests once all supported compilers |
52 | // support char16_t and char32_t (VS2013 does not) |
53 | // char16_t const *const UTF16Literal(u"foobie\\bletch"); |
54 | // char16_t const *const UTF16RawLiteral(uR"(foobie\\bletch)"); |
55 | // char32_t const *const UTF32Literal(U"foobie\\bletch"); |
56 | // char32_t const *const UTF32RawLiteral(UR"(foobie\\bletch)"); |
57 | wchar_t const *const WideLiteral(L"foobie\\bletch"); |
58 | wchar_t const *const WideRawLiteral(LR"(foobie\\bletch)"); |
59 | |
60 | char const *const SingleQuote("goink\'frob"); |
61 | // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: {{.*}} can be written as a raw string literal |
62 | // CHECK-XFIXES: {{^}}char const *const SingleQuote(R"(goink'frob)");{{$}} |
63 | |
64 | char const *const DoubleQuote("goink\"frob"); |
65 | // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: {{.*}} can be written as a raw string literal |
66 | // CHECK-FIXES: {{^}}char const *const DoubleQuote(R"(goink"frob)");{{$}} |
67 | |
68 | char const *const QuestionMark("goink\?frob"); |
69 | // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: {{.*}} can be written as a raw string literal |
70 | // CHECK-FIXES: {{^}}char const *const QuestionMark(R"(goink?frob)");{{$}} |
71 | |
72 | char const *const RegEx("goink\\(one|two\\)\\\\\\?.*\\nfrob"); |
73 | // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}} can be written as a raw string literal |
74 | // CHECK-FIXES: {{^}}char const *const RegEx(R"(goink\(one|two\)\\\?.*\nfrob)");{{$}} |
75 | |
76 | char const *const Path("C:\\Program Files\\Vendor\\Application\\Application.exe"); |
77 | // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} can be written as a raw string literal |
78 | // CHECK-FIXES: {{^}}char const *const Path(R"(C:\Program Files\Vendor\Application\Application.exe)");{{$}} |
79 | |
80 | char const *const ContainsSentinel("who\\ops)\""); |
81 | // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: {{.*}} can be written as a raw string literal |
82 | // CHECK-FIXES: {{^}}char const *const ContainsSentinel(R"lit(who\ops)")lit");{{$}} |
83 | |
84 | char const *const ContainsDelim("whoops)\")lit\""); |
85 | // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: {{.*}} can be written as a raw string literal |
86 | // CHECK-FIXES: {{^}}char const *const ContainsDelim(R"lit1(whoops)")lit")lit1");{{$}} |
87 | |
88 | char const *const OctalPrintable("\100\\"); |
89 | // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: {{.*}} can be written as a raw string literal |
90 | // CHECK-FIXES: {{^}}char const *const OctalPrintable(R"(@\)");{{$}} |
91 | |
92 | char const *const HexPrintable("\x40\\"); |
93 | // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: {{.*}} can be written as a raw string literal |
94 | // CHECK-FIXES: {{^}}char const *const HexPrintable(R"(@\)");{{$}} |
95 | |
96 | char const *const prettyFunction(__PRETTY_FUNCTION__); |
97 | char const *const function(__FUNCTION__); |
98 | char const *const func(__func__); |
99 | |
100 | #define TRICK(arg_) #arg_ |
101 | char const *const MacroBody = TRICK(foo\\bar); |
102 | |
103 | #define HAT(rabbit_) #rabbit_ "foo\\bar" |
104 | char const *const StringizedMacroArgument = HAT(foo\\bar); |
105 | |
106 | #define SUBST(lit_) lit_ |
107 | char const *const MacroArgument = SUBST("foo\\bar"); |
108 | // FIXME: We should be able to replace this string literal macro argument |
109 | |
110 | template <typename T> |
111 | void fn(char const *const Arg) { |
112 | char const *const Str("foo\\bar"); |
113 | // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}} can be written as a raw string literal |
114 | // CHECK-FIXES: {{^}} char const *const Str(R"(foo\bar)");{{$}} |
115 | } |
116 | |
117 | template <> |
118 | void fn<int>(char const *const Arg) { |
119 | char const *const Str("foo\\bar"); |
120 | // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}} can be written as a raw string literal |
121 | // CHECK-FIXES: {{^}} char const *const Str(R"(foo\bar)");{{$}} |
122 | } |
123 | |
124 | void callFn() { |
125 | fn<int>(Arg: "foo\\bar"); |
126 | // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} can be written as a raw string literal |
127 | // CHECK-FIXES: {{^}} fn<int>(R"(foo\bar)");{{$}} |
128 | fn<double>(Arg: "foo\\bar"); |
129 | // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} can be written as a raw string literal |
130 | // CHECK-FIXES: {{^}} fn<double>(R"(foo\bar)");{{$}} |
131 | } |
132 | |
133 | namespace std { |
134 | using size_t = decltype(sizeof(0)); |
135 | namespace ud { |
136 | int operator""_abc(const char *str, std::size_t len); |
137 | } // namespace ud |
138 | } // namespace std |
139 | namespace gh97243 { |
140 | using namespace std::ud; |
141 | auto UserDefinedLiteral = "foo\\bar"_abc; |
142 | // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}} can be written as a raw string literal |
143 | // CHECK-FIXES: {{^}}auto UserDefinedLiteral = R"(foo\bar)"_abc; |
144 | } // namespace gh97243 |
145 |
Definitions
- BackSlash
- PlainLiteral
- Nul
- Soh
- Stx
- Etx
- Enq
- Ack
- Bell
- BackSpace
- HorizontalTab
- NewLine
- VerticalTab
- FormFeed
- CarraigeReturn
- So
- Si
- Dle
- Dc1
- Dc2
- Dc3
- Dc4
- Nak
- Syn
- Etb
- Can
- Em
- Sub
- Esc
- Fs
- Gs
- Rs
- Us
- HexNonPrintable
- Delete
- MultibyteSnowman
- TrailingSpace
- TrailingNewLine
- AlreadyRaw
- UTF8Literal
- UTF8RawLiteral
- WideLiteral
- WideRawLiteral
- SingleQuote
- DoubleQuote
- QuestionMark
- RegEx
- Path
- ContainsSentinel
- ContainsDelim
- OctalPrintable
- HexPrintable
- prettyFunction
- function
- func
- MacroBody
- StringizedMacroArgument
- MacroArgument
- fn
- fn
- callFn
Learn to use CMake with our Intro Training
Find out more