xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/raw-string-literal.cpp (revision 361f363c11265c6ce599a49dd081bab606b14de8)
1e8a3ddafSNathan James // RUN: %check_clang_tidy %s modernize-raw-string-literal %t -- -config="{CheckOptions: {modernize-raw-string-literal.ReplaceShorterLiterals: true}}"
289a1d03eSRichard 
389a1d03eSRichard char const *const BackSlash("goink\\frob");
489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: escaped string literal can be written as a raw string literal [modernize-raw-string-literal]
589a1d03eSRichard // CHECK-FIXES: {{^}}char const *const BackSlash(R"(goink\frob)");{{$}}
689a1d03eSRichard 
789a1d03eSRichard char const *const PlainLiteral("plain literal");
889a1d03eSRichard 
989a1d03eSRichard // Non-printable ASCII characters.
1089a1d03eSRichard char const *const Nul("goink\\\000");
1189a1d03eSRichard char const *const Soh("goink\\\001");
1289a1d03eSRichard char const *const Stx("goink\\\002");
1389a1d03eSRichard char const *const Etx("goink\\\003");
1489a1d03eSRichard char const *const Enq("goink\\\004");
1589a1d03eSRichard char const *const Ack("goink\\\005");
1689a1d03eSRichard char const *const Bell("goink\\\afrob");
1789a1d03eSRichard char const *const BackSpace("goink\\\bfrob");
1889a1d03eSRichard char const *const HorizontalTab("goink\\\tfrob");
1989a1d03eSRichard char const *const NewLine("goink\nfrob");
2089a1d03eSRichard char const *const VerticalTab("goink\\\vfrob");
2189a1d03eSRichard char const *const FormFeed("goink\\\ffrob");
2289a1d03eSRichard char const *const CarraigeReturn("goink\\\rfrob");
2389a1d03eSRichard char const *const So("goink\\\016");
2489a1d03eSRichard char const *const Si("goink\\\017");
2589a1d03eSRichard char const *const Dle("goink\\\020");
2689a1d03eSRichard char const *const Dc1("goink\\\021");
2789a1d03eSRichard char const *const Dc2("goink\\\022");
2889a1d03eSRichard char const *const Dc3("goink\\\023");
2989a1d03eSRichard char const *const Dc4("goink\\\024");
3089a1d03eSRichard char const *const Nak("goink\\\025");
3189a1d03eSRichard char const *const Syn("goink\\\026");
3289a1d03eSRichard char const *const Etb("goink\\\027");
3389a1d03eSRichard char const *const Can("goink\\\030");
3489a1d03eSRichard char const *const Em("goink\\\031");
3589a1d03eSRichard char const *const Sub("goink\\\032");
3689a1d03eSRichard char const *const Esc("goink\\\033");
3789a1d03eSRichard char const *const Fs("goink\\\034");
3889a1d03eSRichard char const *const Gs("goink\\\035");
3989a1d03eSRichard char const *const Rs("goink\\\036");
4089a1d03eSRichard char const *const Us("goink\\\037");
4189a1d03eSRichard char const *const HexNonPrintable("\\\x03");
4289a1d03eSRichard char const *const Delete("\\\177");
4389a1d03eSRichard char const *const MultibyteSnowman("\xE2\x98\x83");
4489a1d03eSRichard // CHECK-FIXES: {{^}}char const *const MultibyteSnowman("\xE2\x98\x83");{{$}}
4589a1d03eSRichard 
4689a1d03eSRichard char const *const TrailingSpace("A line \\with space. \n");
4789a1d03eSRichard char const *const TrailingNewLine("A single \\line.\n");
4889a1d03eSRichard char const *const AlreadyRaw(R"(foobie\\bletch)");
4989a1d03eSRichard auto const *const UTF8Literal(u8"foobie\\bletch");
5089a1d03eSRichard auto const *const UTF8RawLiteral(u8R"(foobie\\bletch)");
5189a1d03eSRichard // TODO: enable these tests once all supported compilers
5289a1d03eSRichard // support char16_t and char32_t (VS2013 does not)
5389a1d03eSRichard // char16_t const *const UTF16Literal(u"foobie\\bletch");
5489a1d03eSRichard // char16_t const *const UTF16RawLiteral(uR"(foobie\\bletch)");
5589a1d03eSRichard // char32_t const *const UTF32Literal(U"foobie\\bletch");
5689a1d03eSRichard // char32_t const *const UTF32RawLiteral(UR"(foobie\\bletch)");
5789a1d03eSRichard wchar_t const *const WideLiteral(L"foobie\\bletch");
5889a1d03eSRichard wchar_t const *const WideRawLiteral(LR"(foobie\\bletch)");
5989a1d03eSRichard 
6089a1d03eSRichard char const *const SingleQuote("goink\'frob");
6189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: {{.*}} can be written as a raw string literal
6289a1d03eSRichard // CHECK-XFIXES: {{^}}char const *const SingleQuote(R"(goink'frob)");{{$}}
6389a1d03eSRichard 
6489a1d03eSRichard char const *const DoubleQuote("goink\"frob");
6589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: {{.*}} can be written as a raw string literal
6689a1d03eSRichard // CHECK-FIXES: {{^}}char const *const DoubleQuote(R"(goink"frob)");{{$}}
6789a1d03eSRichard 
6889a1d03eSRichard char const *const QuestionMark("goink\?frob");
6989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: {{.*}} can be written as a raw string literal
7089a1d03eSRichard // CHECK-FIXES: {{^}}char const *const QuestionMark(R"(goink?frob)");{{$}}
7189a1d03eSRichard 
7289a1d03eSRichard char const *const RegEx("goink\\(one|two\\)\\\\\\?.*\\nfrob");
7389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}} can be written as a raw string literal
7489a1d03eSRichard // CHECK-FIXES: {{^}}char const *const RegEx(R"(goink\(one|two\)\\\?.*\nfrob)");{{$}}
7589a1d03eSRichard 
7689a1d03eSRichard char const *const Path("C:\\Program Files\\Vendor\\Application\\Application.exe");
7789a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} can be written as a raw string literal
7889a1d03eSRichard // CHECK-FIXES: {{^}}char const *const Path(R"(C:\Program Files\Vendor\Application\Application.exe)");{{$}}
7989a1d03eSRichard 
8089a1d03eSRichard char const *const ContainsSentinel("who\\ops)\"");
8189a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: {{.*}} can be written as a raw string literal
8289a1d03eSRichard // CHECK-FIXES: {{^}}char const *const ContainsSentinel(R"lit(who\ops)")lit");{{$}}
8389a1d03eSRichard 
8489a1d03eSRichard char const *const ContainsDelim("whoops)\")lit\"");
8589a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: {{.*}} can be written as a raw string literal
8689a1d03eSRichard // CHECK-FIXES: {{^}}char const *const ContainsDelim(R"lit1(whoops)")lit")lit1");{{$}}
8789a1d03eSRichard 
8889a1d03eSRichard char const *const OctalPrintable("\100\\");
8989a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: {{.*}} can be written as a raw string literal
9089a1d03eSRichard // CHECK-FIXES: {{^}}char const *const OctalPrintable(R"(@\)");{{$}}
9189a1d03eSRichard 
9289a1d03eSRichard char const *const HexPrintable("\x40\\");
9389a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: {{.*}} can be written as a raw string literal
9489a1d03eSRichard // CHECK-FIXES: {{^}}char const *const HexPrintable(R"(@\)");{{$}}
9589a1d03eSRichard 
9689a1d03eSRichard char const *const prettyFunction(__PRETTY_FUNCTION__);
9789a1d03eSRichard char const *const function(__FUNCTION__);
9889a1d03eSRichard char const *const func(__func__);
9989a1d03eSRichard 
10089a1d03eSRichard #define TRICK(arg_) #arg_
10189a1d03eSRichard char const *const MacroBody = TRICK(foo\\bar);
10289a1d03eSRichard 
10389a1d03eSRichard #define HAT(rabbit_) #rabbit_ "foo\\bar"
10489a1d03eSRichard char const *const StringizedMacroArgument = HAT(foo\\bar);
10589a1d03eSRichard 
10689a1d03eSRichard #define SUBST(lit_) lit_
10789a1d03eSRichard char const *const MacroArgument = SUBST("foo\\bar");
10889a1d03eSRichard // FIXME: We should be able to replace this string literal macro argument
10989a1d03eSRichard 
11089a1d03eSRichard template <typename T>
11189a1d03eSRichard void fn(char const *const Arg) {
11289a1d03eSRichard   char const *const Str("foo\\bar");
11389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}} can be written as a raw string literal
11489a1d03eSRichard   // CHECK-FIXES: {{^}}  char const *const Str(R"(foo\bar)");{{$}}
11589a1d03eSRichard }
11689a1d03eSRichard 
11789a1d03eSRichard template <>
11889a1d03eSRichard void fn<int>(char const *const Arg) {
11989a1d03eSRichard   char const *const Str("foo\\bar");
12089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}} can be written as a raw string literal
12189a1d03eSRichard   // CHECK-FIXES: {{^}}  char const *const Str(R"(foo\bar)");{{$}}
12289a1d03eSRichard }
12389a1d03eSRichard 
12489a1d03eSRichard void callFn() {
12589a1d03eSRichard   fn<int>("foo\\bar");
12689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: {{.*}} can be written as a raw string literal
12789a1d03eSRichard   // CHECK-FIXES: {{^}}  fn<int>(R"(foo\bar)");{{$}}
12889a1d03eSRichard   fn<double>("foo\\bar");
12989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} can be written as a raw string literal
13089a1d03eSRichard   // CHECK-FIXES: {{^}}  fn<double>(R"(foo\bar)");{{$}}
13189a1d03eSRichard }
132*361f363cSCongcong Cai 
133*361f363cSCongcong Cai namespace std {
134*361f363cSCongcong Cai using size_t = decltype(sizeof(0));
135*361f363cSCongcong Cai namespace ud {
136*361f363cSCongcong Cai int operator""_abc(const char *str, std::size_t len);
137*361f363cSCongcong Cai } // namespace ud
138*361f363cSCongcong Cai } // namespace std
139*361f363cSCongcong Cai namespace gh97243 {
140*361f363cSCongcong Cai using namespace std::ud;
141*361f363cSCongcong Cai auto UserDefinedLiteral = "foo\\bar"_abc;
142*361f363cSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}} can be written as a raw string literal
143*361f363cSCongcong Cai // CHECK-FIXES: {{^}}auto UserDefinedLiteral = R"(foo\bar)"_abc;
144*361f363cSCongcong Cai } // namespace gh97243
145