*/ namespace
{ class RefToTemp final : public loplugin::FilteringPlugin<RefToTemp>
{ public: explicit RefToTemp(loplugin::InstantiationData const& data)
: FilteringPlugin(data)
{
}
bool VisitVarDecl(const VarDecl* varDecl)
{ if (ignoreLocation(varDecl)) returntrue; // reference parameters might have a default temporary value, which is ok if (isa<ParmVarDecl>(varDecl)) returntrue; if (!varDecl->getType()->isReferenceType()) returntrue; if (!varDecl->getInit()) returntrue; if (!isTemporaryValue(varDecl->getInit())) returntrue;
report(DiagnosticsEngine::Warning, "taking reference to temporary value",
varDecl->getBeginLoc())
<< varDecl->getSourceRange(); returntrue;
}
bool isTemporaryValue(const Expr* expr)
{ if (dyn_cast<MaterializeTemporaryExpr>(expr)) returntrue; if (auto exprWithCleanups = dyn_cast<ExprWithCleanups>(expr)) if (dyn_cast_or_null<MaterializeTemporaryExpr>(
exprWithCleanups->getSubExpr()->IgnoreImpCasts())) returntrue; returnfalse;
}
bool preRun() override
{ if (!compiler.getLangOpts().CPlusPlus) returnfalse; 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.