summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/UninitializedValuesV2.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-01-26 04:49:43 +0000
committerTed Kremenek <kremenek@apple.com>2011-01-26 04:49:43 +0000
commit33ddd9692d1ef9b6535b0019379d7cc139e7a9dd (patch)
tree0383e46f90e0e3795ed6596ae260e21c901606c4 /clang/lib/Analysis/UninitializedValuesV2.cpp
parentce1de6172cbf7c7bf5cbbb4bbaba4940023a5c2e (diff)
downloadbcm5719-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.cpp16
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 &ac;
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());
}
OpenPOWER on IntegriCloud