forked from OSchip/llvm-project
				
			Improve CheckFallThrough analysis in the presense of the new C++ EH
support. WIP. llvm-svn: 93956
This commit is contained in:
		
							parent
							
								
									9074c3fe97
								
							
						
					
					
						commit
						06b602e540
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue