diff options
-rw-r--r-- | clang/lib/Analysis/CheckDeadStores.cpp | 7 | ||||
-rw-r--r-- | clang/test/Analysis/dead-stores.c | 8 |
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Analysis/CheckDeadStores.cpp b/clang/lib/Analysis/CheckDeadStores.cpp index d87bfb1964e..2afc7e0235f 100644 --- a/clang/lib/Analysis/CheckDeadStores.cpp +++ b/clang/lib/Analysis/CheckDeadStores.cpp @@ -149,6 +149,13 @@ public: else if (UnaryOperator* U = dyn_cast<UnaryOperator>(S)) { if (!U->isIncrementOp()) return; + + // Handle: ++x within a subexpression. The solution is not warn + // about preincrements to dead variables when the preincrement occurs + // as a subexpression. This can lead to false negatives, e.g. "(++x);" + // A generalized dead code checker should find such issues. + if (U->isPrefix() && Parents.isSubExpr(U)) + return; Expr *Ex = U->getSubExpr()->IgnoreParenCasts(); diff --git a/clang/test/Analysis/dead-stores.c b/clang/test/Analysis/dead-stores.c index 2a67afd0b0f..71c4e3b28bf 100644 --- a/clang/test/Analysis/dead-stores.c +++ b/clang/test/Analysis/dead-stores.c @@ -74,9 +74,15 @@ int f10() { int f11() { int x = 4; - return ++x; // expected-warning{{never read}} + return x++; // expected-warning{{never read}} } +int f11b() { + int x = 4; + return ++x; // no-warning +} + + int f12a(int y) { int x = y; // expected-warning{{never read}} return 1; |