]> granicus.if.org Git - clang/commitdiff
Improve CheckFallThrough analysis in the presense of the new C++ EH
authorMike Stump <mrs@apple.com>
Wed, 20 Jan 2010 00:34:04 +0000 (00:34 +0000)
committerMike Stump <mrs@apple.com>
Wed, 20 Jan 2010 00:34:04 +0000 (00:34 +0000)
support.  WIP.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93956 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp

index d2ac483db53972623aaf054bab1b4f7862446e10..1e46787d8f1343e20127e5833df55a867ee6321a 100644 (file)
@@ -1496,6 +1496,7 @@ Sema::ControlFlowKind Sema::CheckFallThrough(AnalysisContext &AC) {
   bool HasLiveReturn = false;
   bool HasFakeEdge = false;
   bool HasPlainEdge = false;
+  bool HasAbnormalEdge = false;
   for (CFGBlock::pred_iterator I=cfg->getExit().pred_begin(),
          E = cfg->getExit().pred_end();
        I != E;
@@ -1528,9 +1529,17 @@ Sema::ControlFlowKind Sema::CheckFallThrough(AnalysisContext &AC) {
         continue;
       }
     }
+    if (isa<CXXTryStmt>(S)) {
+      HasAbnormalEdge = true;
+      continue;
+    }
 
     bool NoReturnEdge = false;
     if (CallExpr *C = dyn_cast<CallExpr>(S)) {
+      if (B.succ_begin()[0] != &cfg->getExit()) {
+        HasAbnormalEdge = true;
+        continue;
+      }
       Expr *CEE = C->getCallee()->IgnoreParenCasts();
       if (CEE->getType().getNoReturnAttr()) {
         NoReturnEdge = true;
@@ -1552,7 +1561,7 @@ Sema::ControlFlowKind Sema::CheckFallThrough(AnalysisContext &AC) {
       return NeverFallThrough;
     return NeverFallThroughOrReturn;
   }
-  if (HasFakeEdge || HasLiveReturn)
+  if (HasAbnormalEdge || HasFakeEdge || HasLiveReturn)
     return MaybeFallThrough;
   // This says AlwaysFallThrough for calls to functions that are not marked
   // noreturn, that don't return.  If people would like this warning to be more