diff options
author | Clement Courbet <courbet@google.com> | 2022-06-30 09:34:20 +0200 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2022-08-10 09:08:05 +0200 |
commit | 5331e1229aa6d0d33b5ec9fab7c05310187746d9 (patch) | |
tree | afd317c381c11c7e668f27a2630f197d90b4989f /clang-tools-extra | |
parent | 0071a79532e8d664b734956a431d8c8c942cc25e (diff) | |
download | llvm-5331e1229aa6d0d33b5ec9fab7c05310187746d9.zip llvm-5331e1229aa6d0d33b5ec9fab7c05310187746d9.tar.gz llvm-5331e1229aa6d0d33b5ec9fab7c05310187746d9.tar.bz2 |
[clang][transformer] Fix crash on replacement-less ASTEdit.
Given that we provide an EditGenerator edit(ASTEdit), we can't ever be
sure that the user won't give us an empty replacement.
Differential Revision: https://reviews.llvm.org/D128887
Diffstat (limited to 'clang-tools-extra')
-rw-r--r-- | clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp index a3600ab..9106d5a 100644 --- a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp @@ -90,6 +90,32 @@ TEST(TransformerClangTidyCheckTest, DiagnosticsCorrectlyGenerated) { EXPECT_EQ(Errors[0].Message.FileOffset, 10U); } +transformer::ASTEdit noReplacementEdit(transformer::RangeSelector Target) { + transformer::ASTEdit E; + E.TargetRange = std::move(Target); + return E; +} + +TEST(TransformerClangTidyCheckTest, EmptyReplacement) { + class DiagOnlyCheck : public TransformerClangTidyCheck { + public: + DiagOnlyCheck(StringRef Name, ClangTidyContext *Context) + : TransformerClangTidyCheck( + makeRule(returnStmt(), edit(noReplacementEdit(node(RootID))), + cat("message")), + Name, Context) {} + }; + std::string Input = "int h() { return 5; }"; + std::vector<ClangTidyError> Errors; + EXPECT_EQ("int h() { }", test::runCheckOnCode<DiagOnlyCheck>(Input, &Errors)); + EXPECT_EQ(Errors.size(), 1U); + EXPECT_EQ(Errors[0].Message.Message, "message"); + EXPECT_THAT(Errors[0].Message.Ranges, testing::IsEmpty()); + + // The diagnostic is anchored to the match, "return 5". + EXPECT_EQ(Errors[0].Message.FileOffset, 10U); +} + TEST(TransformerClangTidyCheckTest, DiagnosticMessageEscaped) { class GiveDiagWithPercentSymbol : public TransformerClangTidyCheck { public: |