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