in src/checks/manuallevel/unused-result-check.cpp [28:53]
void run(const MatchFinder::MatchResult &result) override
{
if (const auto *callExpr = result.Nodes.getNodeAs<CXXMemberCallExpr>("callExpr")) {
if (callExpr->getMethodDecl()->isConst() && !callExpr->getMethodDecl()->getReturnType()->isVoidType()) {
const auto &parents = result.Context->getParents(*callExpr);
if (parents[0].get<Stmt>() != nullptr && parents[0].get<Decl>() == nullptr) {
if (!llvm::dyn_cast<Expr>(parents[0].get<Stmt>()) && !llvm::dyn_cast<ReturnStmt>(parents[0].get<Stmt>())
&& !llvm::dyn_cast<IfStmt>(parents[0].get<Stmt>()) && !llvm::dyn_cast<WhileStmt>(parents[0].get<Stmt>())
&& !llvm::dyn_cast<DoStmt>(parents[0].get<Stmt>()) && !llvm::dyn_cast<SwitchStmt>(parents[0].get<Stmt>())
&& !llvm::dyn_cast<ForStmt>(parents[0].get<Stmt>())
&& !llvm::dyn_cast<CXXThisExpr>(parents[0].get<Stmt>())
// Ignore this false positive from a Qt header for now, we pass a mutable pointer to a static function
&& clazy::qualifiedMethodName(callExpr->getMethodDecl()) != "QMetaType::registerHelper") {
m_check->emitWarning(callExpr->getExprLoc(), "Result of const member function is not used.");
}
}
else if (parents[0].get<Decl>() != nullptr && parents[0].get<Stmt>() == nullptr) {
if (!llvm::dyn_cast<VarDecl>(parents[0].get<Decl>()) && !llvm::dyn_cast<CXXConstructorDecl>(parents[0].get<Decl>())) {
m_check->emitWarning(callExpr->getExprLoc(), "Result of const member function is not used.");
}
}
}
}
}