diff options
author | Richard Trieu <rtrieu@google.com> | 2014-08-27 22:15:10 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2014-08-27 22:15:10 +0000 |
commit | abf6ec45cd6454c1c3c9e29aa3367c219ddc3b7d (patch) | |
tree | 7a0fa6e4cc158db19cc2991415c3c3bc4fd6454f /clang/lib/Analysis/UninitializedValues.cpp | |
parent | dc498e516fb2a32df1c3b7a1dc1c8f773d73f52d (diff) | |
download | bcm5719-llvm-abf6ec45cd6454c1c3c9e29aa3367c219ddc3b7d.tar.gz bcm5719-llvm-abf6ec45cd6454c1c3c9e29aa3367c219ddc3b7d.zip |
More -Wuninitialized updates
Fix r216438 to catch more complicated self-initialized in std::move. For
instance, "Foo f = std::move(cond ? OtherFoo : (UNUSED_VALUE, f));"
Make sure that BinaryConditionalOperator, ConditionalOperator, BinaryOperator
with comma operator, and OpaqueValueExpr perform the correct usage forwarding
across the three uninitialized value checkers.
llvm-svn: 216627
Diffstat (limited to 'clang/lib/Analysis/UninitializedValues.cpp')
-rw-r--r-- | clang/lib/Analysis/UninitializedValues.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/clang/lib/Analysis/UninitializedValues.cpp b/clang/lib/Analysis/UninitializedValues.cpp index da4d072807c..ef2cf36f3ca 100644 --- a/clang/lib/Analysis/UninitializedValues.cpp +++ b/clang/lib/Analysis/UninitializedValues.cpp @@ -300,13 +300,28 @@ void ClassifyRefs::classify(const Expr *E, Class C) { // The result of a ?: could also be an lvalue. E = E->IgnoreParens(); if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) { - const Expr *TrueExpr = CO->getTrueExpr(); - if (!isa<OpaqueValueExpr>(TrueExpr)) - classify(TrueExpr, C); + classify(CO->getTrueExpr(), C); classify(CO->getFalseExpr(), C); return; } + if (const BinaryConditionalOperator *BCO = + dyn_cast<BinaryConditionalOperator>(E)) { + classify(BCO->getFalseExpr(), C); + return; + } + + if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) { + classify(OVE->getSourceExpr(), C); + return; + } + + if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) { + if (BO->getOpcode() == BO_Comma) + classify(BO->getRHS(), C); + return; + } + FindVarResult Var = findVar(E, DC); if (const DeclRefExpr *DRE = Var.getDeclRefExpr()) Classification[DRE] = std::max(Classification[DRE], C); |