diff options
| author | Manuel Klimek <klimek@google.com> | 2014-08-07 14:25:43 +0000 |
|---|---|---|
| committer | Manuel Klimek <klimek@google.com> | 2014-08-07 14:25:43 +0000 |
| commit | 0ce91081044ecc1f0896c8157e97c95479124e11 (patch) | |
| tree | 0933d1d78e3c3830238fa388cb5bf26ba653461e /clang/lib | |
| parent | b0ece4e07d007df7f2b6e341fbea6b2bca5a6a16 (diff) | |
| download | bcm5719-llvm-0ce91081044ecc1f0896c8157e97c95479124e11.tar.gz bcm5719-llvm-0ce91081044ecc1f0896c8157e97c95479124e11.zip | |
Only have one path in the CFG for ternaries if the condition is known.
The return type analysis requires that the CFG is simplified when the
truth values of branches are statically known at analysis time.
llvm-svn: 215114
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Analysis/CFG.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 20438b47877..b9698d550bf 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -3711,15 +3711,24 @@ CFGBlock *CFGBuilder::VisitConditionalOperatorForTemporaryDtors( VisitForTemporaryDtors(E->getCond(), false, Context); CFGBlock *ConditionBlock = Block; CFGBlock *ConditionSucc = Succ; + TryResult ConditionVal = tryEvaluateBool(E->getCond()); TempDtorContext TrueContext(/*IsConditional=*/true); - VisitForTemporaryDtors(E->getTrueExpr(), BindToTemporary, TrueContext); + if (!ConditionVal.isFalse()) { + VisitForTemporaryDtors(E->getTrueExpr(), BindToTemporary, TrueContext); + if (ConditionVal.isTrue()) + return Block; + } CFGBlock *TrueBlock = Block; Block = ConditionBlock; Succ = ConditionSucc; TempDtorContext FalseContext(/*IsConditional=*/true); - VisitForTemporaryDtors(E->getFalseExpr(), BindToTemporary, FalseContext); + if (!ConditionVal.isTrue()) { + VisitForTemporaryDtors(E->getFalseExpr(), BindToTemporary, FalseContext); + if (ConditionVal.isFalse()) + return Block; + } if (TrueContext.TerminatorExpr && FalseContext.TerminatorExpr) { InsertTempDtorDecisionBlock(FalseContext, TrueBlock); |

