================ @@ -40,12 +42,35 @@ void AvoidReturnWithVoidValueCheck::registerMatchers(MatchFinder *Finder) { void AvoidReturnWithVoidValueCheck::check( const MatchFinder::MatchResult &Result) { const auto *VoidReturn = Result.Nodes.getNodeAs<ReturnStmt>("void_return"); - if (IgnoreMacros && VoidReturn->getBeginLoc().isMacroID()) + if (IgnoreMacros && VoidReturn->getBeginLoc().isMacroID()) { return; - if (!StrictMode && !Result.Nodes.getNodeAs<CompoundStmt>("compound_parent")) + } + const auto *SurroundingBlock = + Result.Nodes.getNodeAs<CompoundStmt>("compound_parent"); + if (!StrictMode && !SurroundingBlock) { return; - diag(VoidReturn->getBeginLoc(), "return statement within a void function " - "should not have a specified return value"); + } + DiagnosticBuilder Diag = diag(VoidReturn->getBeginLoc(), + "return statement within a void function " + "should not have a specified return value"); + std::optional<Token> SemicolonPos = + Lexer::findNextToken(VoidReturn->getRetValue()->getEndLoc(), + *Result.SourceManager, getLangOpts()); + if (!SemicolonPos) { + return; + } + const StringRef ReturnExpr = + Lexer::getSourceText(CharSourceRange::getTokenRange( + VoidReturn->getRetValue()->getSourceRange()), + *Result.SourceManager, getLangOpts()); + std::string Replacement = (ReturnExpr + "; return;").str(); + if (!SurroundingBlock) { + Replacement = "{" + Replacement + "}"; + } + Diag << FixItHint::CreateReplacement( ---------------- PiotrZSL wrote:
instead of replacing just use [CreateRemoval](https://clang.llvm.org/doxygen/classclang_1_1FixItHint.html#a9e11ae1e22983fd4abea805755ecddbe) to remove begin, and [CreateInsertion](https://clang.llvm.org/doxygen/classclang_1_1FixItHint.html#afd481d826e9ddaa39fc82a698a810246) to insert `return;` and `{}` if needed. https://github.com/llvm/llvm-project/pull/81420 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits