diff options
| author | Manuel Klimek <klimek@google.com> | 2014-05-08 11:50:00 +0000 |
|---|---|---|
| committer | Manuel Klimek <klimek@google.com> | 2014-05-08 11:50:00 +0000 |
| commit | b33bded1762064cf690f69bee3dbb5a94d634dd2 (patch) | |
| tree | cad21f328ba2462726b2815cfda402a5d51e55a3 /clang/lib | |
| parent | 49ff754d4be5d8eb84f71eb2d97156901d4290cd (diff) | |
| download | bcm5719-llvm-b33bded1762064cf690f69bee3dbb5a94d634dd2.tar.gz bcm5719-llvm-b33bded1762064cf690f69bee3dbb5a94d634dd2.zip | |
Explicitly keep track of temporaries during the consumed analysis.
This makes the consumed analysis less dependent on the CFG layout and fixes
a bug where we wouldn't warn on an unconsumed value.
llvm-svn: 208300
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Analysis/Consumed.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/clang/lib/Analysis/Consumed.cpp b/clang/lib/Analysis/Consumed.cpp index 6d590ab2e3d..e3dcb923786 100644 --- a/clang/lib/Analysis/Consumed.cpp +++ b/clang/lib/Analysis/Consumed.cpp @@ -1233,8 +1233,8 @@ void ConsumedStateMap::setState(const CXXBindTemporaryExpr *Tmp, TmpMap[Tmp] = State; } -void ConsumedStateMap::remove(const VarDecl *Var) { - VarMap.erase(Var); +void ConsumedStateMap::remove(const CXXBindTemporaryExpr *Tmp) { + TmpMap.erase(Tmp); } bool ConsumedStateMap::operator!=(const ConsumedStateMap *Other) const { @@ -1413,6 +1413,7 @@ void ConsumedAnalyzer::run(AnalysisDeclContext &AC) { Visitor.checkCallability(PropagationInfo(BTE), DTor.getDestructorDecl(AC.getASTContext()), BTE->getExprLoc()); + CurrStates->remove(BTE); break; } @@ -1432,8 +1433,6 @@ void ConsumedAnalyzer::run(AnalysisDeclContext &AC) { } } - CurrStates->clearTemporaries(); - // TODO: Handle other forms of branching with precision, including while- // and for-loops. (Deferred) if (!splitState(CurrBlock, Visitor)) { |

