diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Analysis/CFG.cpp | 17 | 
1 files changed, 6 insertions, 11 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 02fe22c00fe..7ad688fd68d 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -473,19 +473,13 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {      return WalkAST(cast<ParenExpr>(Terminator)->getSubExpr(), AlwaysAddStmt);    case Stmt::CallExprClass: { -    bool NoReturn = false; -    CallExpr *C = cast<CallExpr>(Terminator); -    if (FunctionDecl *FD = C->getDirectCallee()) -      if (FD->hasAttr<NoReturnAttr>()) -        NoReturn = true; - -    if (!NoReturn) +    // If this is a call to a no-return function, this stops the block here. +    FunctionDecl *FD = cast<CallExpr>(Terminator)->getDirectCallee(); +    if (FD == 0 || !FD->hasAttr<NoReturnAttr>())        break; -    if (Block) { -      if (!FinishBlock(Block)) -        return 0; -    } +    if (Block && !FinishBlock(Block)) +      return 0;      // Create new block with no successor for the remaining pieces.      Block = createBlock(false); @@ -498,6 +492,7 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* Terminator, bool AlwaysAddStmt = false) {    }    default: +    // TODO: We can follow objective-c methods (message sends).      break;    };  | 

