diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp b/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp index 332c02c..f5c786a 100644 --- a/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp +++ b/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp @@ -34,7 +34,7 @@ using namespace clang; static bool isTrackedVar(const VarDecl *vd, const DeclContext *dc) { if (vd->isLocalVarDecl() && !vd->hasGlobalStorage() && - !vd->isExceptionVariable() && + !vd->isExceptionVariable() && !vd->isInitCapture() && vd->getDeclContext() == dc) { QualType ty = vd->getType(); return ty->isScalarType() || ty->isVectorType(); @@ -236,7 +236,7 @@ void DataflowWorklist::enqueueSuccessors(const clang::CFGBlock *block) { } const CFGBlock *DataflowWorklist::dequeue() { - const CFGBlock *B = 0; + const CFGBlock *B = nullptr; // First dequeue from the worklist. This can represent // updates along backedges that we want propagated as quickly as possible. @@ -250,7 +250,7 @@ const CFGBlock *DataflowWorklist::dequeue() { ++PO_I; } else { - return 0; + return nullptr; } assert(enqueuedBlocks[B->getBlockID()] == true); @@ -295,7 +295,7 @@ static FindVarResult findVar(const Expr *E, const DeclContext *DC) { if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) if (isTrackedVar(VD, DC)) return FindVarResult(VD, DRE); - return FindVarResult(0, 0); + return FindVarResult(nullptr, nullptr); } /// \brief Classify each DeclRefExpr as an initialization or a use. Any @@ -353,7 +353,7 @@ static const DeclRefExpr *getSelfInitExpr(VarDecl *VD) { if (DRE && DRE->getDecl() == VD) return DRE; } - return 0; + return nullptr; } void ClassifyRefs::classify(const Expr *E, Class C) { @@ -373,9 +373,8 @@ void ClassifyRefs::classify(const Expr *E, Class C) { } void ClassifyRefs::VisitDeclStmt(DeclStmt *DS) { - for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end(); - DI != DE; ++DI) { - VarDecl *VD = dyn_cast<VarDecl>(*DI); + for (auto *DI : DS->decls()) { + VarDecl *VD = dyn_cast<VarDecl>(DI); if (VD && isTrackedVar(VD)) if (const DeclRefExpr *DRE = getSelfInitExpr(VD)) Classification[DRE] = SelfInit; @@ -535,12 +534,15 @@ public: for (CFGBlock::const_pred_iterator I = B->pred_begin(), E = B->pred_end(); I != E; ++I) { const CFGBlock *Pred = *I; + if (!Pred) + continue; + Value AtPredExit = vals.getValue(Pred, B, vd); if (AtPredExit == Initialized) // This block initializes the variable. continue; if (AtPredExit == MayUninitialized && - vals.getValue(B, 0, vd) == Uninitialized) { + vals.getValue(B, nullptr, vd) == Uninitialized) { // This block declares the variable (uninitialized), and is reachable // from a block that initializes the variable. We can't guarantee to // give an earlier location for the diagnostic (and it appears that @@ -630,12 +632,11 @@ void TransferFunctions::VisitObjCForCollectionStmt(ObjCForCollectionStmt *FS) { void TransferFunctions::VisitBlockExpr(BlockExpr *be) { const BlockDecl *bd = be->getBlockDecl(); - for (BlockDecl::capture_const_iterator i = bd->capture_begin(), - e = bd->capture_end() ; i != e; ++i) { - const VarDecl *vd = i->getVariable(); + for (const auto &I : bd->captures()) { + const VarDecl *vd = I.getVariable(); if (!isTrackedVar(vd)) continue; - if (i->isByRef()) { + if (I.isByRef()) { vals[vd] = Initialized; continue; } @@ -691,9 +692,8 @@ void TransferFunctions::VisitBinaryOperator(BinaryOperator *BO) { } void TransferFunctions::VisitDeclStmt(DeclStmt *DS) { - for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end(); - DI != DE; ++DI) { - VarDecl *VD = dyn_cast<VarDecl>(*DI); + for (auto *DI : DS->decls()) { + VarDecl *VD = dyn_cast<VarDecl>(DI); if (VD && isTrackedVar(VD)) { if (getSelfInitExpr(VD)) { // If the initializer consists solely of a reference to itself, we @@ -751,6 +751,8 @@ static bool runOnBlock(const CFGBlock *block, const CFG &cfg, for (CFGBlock::const_pred_iterator I = block->pred_begin(), E = block->pred_end(); I != E; ++I) { const CFGBlock *pred = *I; + if (!pred) + continue; if (wasAnalyzed[pred->getBlockID()]) { vals.mergeIntoScratch(vals.getValueVector(pred), isFirst); isFirst = false; @@ -787,8 +789,8 @@ struct PruneBlocksHandler : public UninitVariablesHandler { /// The current block to scribble use information. unsigned currentBlock; - virtual void handleUseOfUninitVariable(const VarDecl *vd, - const UninitUse &use) { + void handleUseOfUninitVariable(const VarDecl *vd, + const UninitUse &use) override { hadUse[currentBlock] = true; hadAnyUse = true; } @@ -796,7 +798,7 @@ struct PruneBlocksHandler : public UninitVariablesHandler { /// Called when the uninitialized variable analysis detects the /// idiom 'int x = x'. All other uses of 'x' within the initializer /// are handled by handleUseOfUninitVariable. - virtual void handleSelfInit(const VarDecl *vd) { + void handleSelfInit(const VarDecl *vd) override { hadUse[currentBlock] = true; hadAnyUse = true; } |