bool Cow_Wrapper::VisitCXXMemberCallExpr(const CXXMemberCallExpr* memberCallExpr)
{ if (ignoreLocation(memberCallExpr)) returntrue; auto methodDecl = memberCallExpr->getMethodDecl(); if (!methodDecl || !methodDecl->isConst()) returntrue;
auto expr = memberCallExpr->getImplicitObjectArgument()->IgnoreImplicit()->IgnoreParens(); auto operatorCallExpr = dyn_cast<CXXOperatorCallExpr>(expr);
if (operatorCallExpr && operatorCallExpr->getOperator() == OO_Arrow)
{ auto arrowMethodDecl = dyn_cast_or_null<CXXMethodDecl>(operatorCallExpr->getDirectCallee()); if (!arrowMethodDecl) returntrue; if (arrowMethodDecl->isConst()) returntrue; auto dc = loplugin::DeclCheck(arrowMethodDecl->getParent())
.Class("cow_wrapper")
.Namespace("o3tl")
.GlobalNamespace(); if (!dc) returntrue;
} elseif (operatorCallExpr)
{ auto methodDecl2 = dyn_cast_or_null<CXXMethodDecl>(operatorCallExpr->getDirectCallee()); if (!methodDecl2) returntrue; auto dc = loplugin::DeclCheck(methodDecl2->getParent())
.Class("cow_wrapper")
.Namespace("o3tl")
.GlobalNamespace(); if (!dc) returntrue;
} elseif (auto callExpr = dyn_cast<CallExpr>(expr))
{ if (!isa<ImplicitCastExpr>(callExpr->getCallee())) // std::as_const shows up as this returntrue; if (callExpr->getNumArgs() < 1) returntrue; auto arg0 = dyn_cast<CXXOperatorCallExpr>(callExpr->getArg(0)); if (!arg0) returntrue; auto starMethodDecl = dyn_cast_or_null<CXXMethodDecl>(arg0->getDirectCallee()); if (!starMethodDecl) returntrue; auto dc = loplugin::DeclCheck(starMethodDecl->getParent())
.Class("cow_wrapper")
.Namespace("o3tl")
.GlobalNamespace(); if (!dc) returntrue;
} else returntrue;
report(DiagnosticsEngine::Warning, "calling const method on o3tl::cow_wrapper impl class via non-const pointer, rather use " "std::as_const to prevent triggering an unnecessary copy",
memberCallExpr->getBeginLoc())
<< memberCallExpr->getSourceRange(); returntrue;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.