https://github.com/robozati updated https://github.com/llvm/llvm-project/pull/69775
>From c644be1d123769395bed6ea069a45c051e3fc66d Mon Sep 17 00:00:00 2001 From: robozati <139823421+roboz...@users.noreply.github.com> Date: Fri, 20 Oct 2023 17:23:21 -0300 Subject: [PATCH 1/2] Fix RawStringLiteral being available to C and C++ versions prior to C++11 --- .../refactor/tweaks/RawStringLiteral.cpp | 8 +++++++- .../unittests/tweaks/RawStringLiteralTests.cpp | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clangd/refactor/tweaks/RawStringLiteral.cpp b/clang-tools-extra/clangd/refactor/tweaks/RawStringLiteral.cpp index f5021b820f38d7f..82c908b494790cb 100644 --- a/clang-tools-extra/clangd/refactor/tweaks/RawStringLiteral.cpp +++ b/clang-tools-extra/clangd/refactor/tweaks/RawStringLiteral.cpp @@ -43,6 +43,12 @@ class RawStringLiteral : public Tweak { REGISTER_TWEAK(RawStringLiteral) +static bool isFeatureAvailable(const Tweak::Selection &Inputs) { + // Raw strings are available only for C++11 or later versions, and they are + // not available for C. + return Inputs.AST->getASTContext().getLangOpts().CPlusPlus11; +} + static bool isNormalString(const StringLiteral &Str, SourceLocation Cursor, SourceManager &SM) { // All chunks must be normal ASCII strings, not u8"..." etc. @@ -76,7 +82,7 @@ bool RawStringLiteral::prepare(const Selection &Inputs) { if (!N) return false; Str = dyn_cast_or_null<StringLiteral>(N->ASTNode.get<Stmt>()); - return Str && + return Str && isFeatureAvailable(Inputs) && isNormalString(*Str, Inputs.Cursor, Inputs.AST->getSourceManager()) && needsRaw(Str->getBytes()) && canBeRaw(Str->getBytes()); } diff --git a/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp index 4bc304559705031..0e96dfbe2e376bc 100644 --- a/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp @@ -36,6 +36,24 @@ literal)")cpp"; EXPECT_EQ(apply(Input), Output); } +TEST_F(RawStringLiteralTest, TestC) { + Context = File; + FileName = "TestTU.c"; + ExtraArgs = {"-xc"}; // raw strings are unavailable in C + EXPECT_UNAVAILABLE(R"c( + const char* a = "^f^o^o^\^n^"; + )c"); +} + +TEST_F(RawStringLiteralTest, TestCpp98) { + Context = File; + ExtraArgs = {"-std=c++98"}; // raw strings are unavailable + // in versions prior to C++11 + EXPECT_UNAVAILABLE(R"cpp( + const char* a = "^f^o^o^\^n^"; + )cpp"); +} + } // namespace } // namespace clangd } // namespace clang >From e5923e038d38c4ea49834f7a417a1294d58bcfc5 Mon Sep 17 00:00:00 2001 From: robozati <139823421+roboz...@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:03:17 -0300 Subject: [PATCH 2/2] Fix tests sometimes failing --- .../clangd/unittests/tweaks/RawStringLiteralTests.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp b/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp index 0e96dfbe2e376bc..2681b8c815dbae3 100644 --- a/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp +++ b/clang-tools-extra/clangd/unittests/tweaks/RawStringLiteralTests.cpp @@ -40,18 +40,14 @@ TEST_F(RawStringLiteralTest, TestC) { Context = File; FileName = "TestTU.c"; ExtraArgs = {"-xc"}; // raw strings are unavailable in C - EXPECT_UNAVAILABLE(R"c( - const char* a = "^f^o^o^\^n^"; - )c"); + EXPECT_UNAVAILABLE(R"c(const char *a = ^"^f^o^o^\^n^";)c"); } TEST_F(RawStringLiteralTest, TestCpp98) { Context = File; ExtraArgs = {"-std=c++98"}; // raw strings are unavailable // in versions prior to C++11 - EXPECT_UNAVAILABLE(R"cpp( - const char* a = "^f^o^o^\^n^"; - )cpp"); + EXPECT_UNAVAILABLE(R"cpp(const char *a = ^"^f^o^o^\^n^";)cpp"); } } // namespace _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits