r215114 - Only have one path in the CFG for ternaries if the condition is known.

Manuel Klimek klimek at google.com
Thu Aug 7 07:25:43 PDT 2014


Author: klimek
Date: Thu Aug  7 09:25:43 2014
New Revision: 215114

URL: http://llvm.org/viewvc/llvm-project?rev=215114&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Analysis/CFG.cpp
    cfe/trunk/test/SemaCXX/return-noreturn.cpp

Modified: cfe/trunk/lib/Analysis/CFG.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=215114&r1=215113&r2=215114&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CFG.cpp (original)
+++ cfe/trunk/lib/Analysis/CFG.cpp Thu Aug  7 09:25:43 2014
@@ -3711,15 +3711,24 @@ CFGBlock *CFGBuilder::VisitConditionalOp
   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);

Modified: cfe/trunk/test/SemaCXX/return-noreturn.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/return-noreturn.cpp?rev=215114&r1=215113&r2=215114&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/return-noreturn.cpp (original)
+++ cfe/trunk/test/SemaCXX/return-noreturn.cpp Thu Aug  7 09:25:43 2014
@@ -159,6 +159,22 @@ int testTernaryUnconditionalNoreturn() {
   true ? NoReturn() : NoReturn();
 }
 
+int testTernaryStaticallyConditionalNoretrunOnTrue() {
+  true ? NoReturn() : Return();
+}
+
+int testTernaryStaticallyConditionalRetrunOnTrue() {
+  true ? Return() : NoReturn();
+} // expected-warning {{control reaches end of non-void function}}
+
+int testTernaryStaticallyConditionalNoretrunOnFalse() {
+  false ? Return() : NoReturn();
+}
+
+int testTernaryStaticallyConditionalRetrunOnFalse() {
+  false ? NoReturn() : Return();
+} // expected-warning {{control reaches end of non-void function}}
+
 int testTernaryConditionalNoreturnTrueBranch(bool value) {
   value ? (NoReturn() || NoReturn()) : Return();
 } // expected-warning {{control may reach end of non-void function}}





More information about the cfe-commits mailing list