summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-07-15 18:06:32 +0000
committerTed Kremenek <kremenek@apple.com>2008-07-15 18:06:32 +0000
commit81bfc074c9d14cc4c9b1e45035a386f81c0217d5 (patch)
tree263f18fa42d0cc6acf8ece65326c994f4620ac92
parent24768e3dc4c1f86e3015180325bf257917c207c3 (diff)
downloadbcm5719-llvm-81bfc074c9d14cc4c9b1e45035a386f81c0217d5.tar.gz
bcm5719-llvm-81bfc074c9d14cc4c9b1e45035a386f81c0217d5.zip
Distinguish between dead stores and dead initializations.
llvm-svn: 53628
-rw-r--r--clang/lib/Analysis/DeadStores.cpp28
-rw-r--r--clang/test/Analysis/conditional-op-missing-lhs.c2
2 files changed, 20 insertions, 10 deletions
diff --git a/clang/lib/Analysis/DeadStores.cpp b/clang/lib/Analysis/DeadStores.cpp
index 0bbd8786098..b9d9382f6ce 100644
--- a/clang/lib/Analysis/DeadStores.cpp
+++ b/clang/lib/Analysis/DeadStores.cpp
@@ -37,16 +37,26 @@ public:
virtual ~DeadStoreObs() {}
- void Report(VarDecl* V, bool inEnclosing, SourceLocation L, SourceRange R) {
+ void Report(VarDecl* V, bool inEnclosing, SourceLocation L, SourceRange R,
+ bool isInitialization = false) {
- std::string name(V->getName());
- std::string msg = inEnclosing
- ? "Although the value stored to '" + name +
- "' is used in the enclosing expression, the value is never actually"
- " read from '" + name + "'"
- : "Value stored to '" + name + "' is never read";
+ std::string name(V->getName());
- BR.EmitBasicReport("dead store", msg.c_str(), L, R);
+ if (isInitialization) {
+ std::string msg = "Value stored to '" + name +
+ "' during its initialization is never read";
+
+ BR.EmitBasicReport("dead initialization", msg.c_str(), L, R);
+ }
+ else {
+ std::string msg = inEnclosing
+ ? "Although the value stored to '" + name +
+ "' is used in the enclosing expression, the value is never actually"
+ " read from '" + name + "'"
+ : "Value stored to '" + name + "' is never read";
+
+ BR.EmitBasicReport("dead store", msg.c_str(), L, R);
+ }
}
void CheckVarDecl(VarDecl* VD, Expr* Ex, Expr* Val,
@@ -124,7 +134,7 @@ public:
// a warning. This is because such initialization can be
// due to defensive programming.
if (!E->isConstantExpr(Ctx,NULL))
- Report(V, false, V->getLocation(), E->getSourceRange());
+ Report(V, false, V->getLocation(), E->getSourceRange(), true);
}
}
}
diff --git a/clang/test/Analysis/conditional-op-missing-lhs.c b/clang/test/Analysis/conditional-op-missing-lhs.c
index 6296291cdfb..9fbb9f19875 100644
--- a/clang/test/Analysis/conditional-op-missing-lhs.c
+++ b/clang/test/Analysis/conditional-op-missing-lhs.c
@@ -4,7 +4,7 @@ void f1()
{
int i;
- int j = i ? : 1; // expected-warning{{use of uninitialized variable}} //expected-warning{{Value stored to 'j' is never read}}
+ int j = i ? : 1; // expected-warning{{use of uninitialized variable}} //expected-warning{{Value stored to 'j' during its initialization is never read}}
}
void *f2(int *i)
OpenPOWER on IntegriCloud