diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-01-26 04:49:43 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-01-26 04:49:43 +0000 |
commit | 33ddd9692d1ef9b6535b0019379d7cc139e7a9dd (patch) | |
tree | 0383e46f90e0e3795ed6596ae260e21c901606c4 /clang/lib/Analysis/UninitializedValuesV2.cpp | |
parent | ce1de6172cbf7c7bf5cbbb4bbaba4940023a5c2e (diff) | |
download | bcm5719-llvm-33ddd9692d1ef9b6535b0019379d7cc139e7a9dd.tar.gz bcm5719-llvm-33ddd9692d1ef9b6535b0019379d7cc139e7a9dd.zip |
Tweak -Wuninitialized-experimental to not emit
a warning for uses of an uninitialized variable
when the use is a void cast, e.g. (void) x.
llvm-svn: 124278
Diffstat (limited to 'clang/lib/Analysis/UninitializedValuesV2.cpp')
-rw-r--r-- | clang/lib/Analysis/UninitializedValuesV2.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/clang/lib/Analysis/UninitializedValuesV2.cpp b/clang/lib/Analysis/UninitializedValuesV2.cpp index 4edc1a965bd..32630549599 100644 --- a/clang/lib/Analysis/UninitializedValuesV2.cpp +++ b/clang/lib/Analysis/UninitializedValuesV2.cpp @@ -291,6 +291,7 @@ class TransferFunctions : public CFGRecStmtVisitor<TransferFunctions> { AnalysisContext ∾ UninitVariablesHandler *handler; const DeclRefExpr *currentDR; + const Expr *currentVoidCast; const bool flagBlockUses; public: TransferFunctions(CFGBlockValues &vals, const CFG &cfg, @@ -298,7 +299,7 @@ public: UninitVariablesHandler *handler, bool flagBlockUses) : vals(vals), cfg(cfg), ac(ac), handler(handler), currentDR(0), - flagBlockUses(flagBlockUses) {} + currentVoidCast(0), flagBlockUses(flagBlockUses) {} const CFG &getCFG() { return cfg; } void reportUninit(const DeclRefExpr *ex, const VarDecl *vd); @@ -446,14 +447,23 @@ void TransferFunctions::VisitCastExpr(clang::CastExpr *ce) { SaveAndRestore<const DeclRefExpr*> lastDR(currentDR, res.getDeclRefExpr()); Visit(ce->getSubExpr()); - if (vals[vd] == Uninitialized) { + if (currentVoidCast != ce && vals[vd] == Uninitialized) { reportUninit(res.getDeclRefExpr(), vd); // Don't cascade warnings. vals[vd] = Initialized; } return; } - } + } + else if (CStyleCastExpr *cse = dyn_cast<CStyleCastExpr>(ce)) { + if (cse->getType()->isVoidType()) { + // e.g. (void) x; + SaveAndRestore<const Expr *> + lastVoidCast(currentVoidCast, cse->getSubExpr()->IgnoreParens()); + Visit(cse->getSubExpr()); + return; + } + } Visit(ce->getSubExpr()); } |