diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp --- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp @@ -156,6 +156,15 @@ auto UnusedInRangeForStmt = cxxForRangeStmt(hasBody(MatchedCallExpr)); auto UnusedInCaseStmt = switchCase(forEach(MatchedCallExpr)); + Finder->addMatcher( + callExpr(callee(functionDecl(anyOf( + hasReturnTypeLoc(loc(asString("std::error_code"))), + hasReturnTypeLoc(loc(asString("std::expected"))), + hasReturnTypeLoc(loc(asString("boost::system::error_code"))), + hasReturnTypeLoc(loc(asString("abseil::Status"))))))) + .bind("return-types"), + this); + Finder->addMatcher( stmt(anyOf(UnusedInCompoundStmt, UnusedInIfStmt, UnusedInWhileStmt, UnusedInDoStmt, UnusedInForStmt, UnusedInRangeForStmt, @@ -164,6 +173,16 @@ } void UnusedReturnValueCheck::check(const MatchFinder::MatchResult &Result) { + + if (const auto *Matched = Result.Nodes.getNodeAs("return-types")) { + diag(Matched->getBeginLoc(), + "the value returned by this function should be used") + << Matched->getSourceRange(); + diag(Matched->getBeginLoc(), + "cast the expression to void to silence this warning", + DiagnosticIDs::Note); + }; + if (const auto *Matched = Result.Nodes.getNodeAs("match")) { diag(Matched->getBeginLoc(), "the value returned by this function should be used")