From: Mike Stump Date: Wed, 20 Jan 2010 01:15:34 +0000 (+0000) Subject: Add an exceptional edge from the try terminated block to the outer EH X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a1f93631a84621d77aeb627691da85a8991af188;p=clang Add an exceptional edge from the try terminated block to the outer EH context (try or the Exit block) when there isn't a catch (...). Improve CFG printing for catch (...). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93962 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 6508c351f0..33c3f551dd 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -1599,6 +1599,7 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) { } else TrySuccessor = Succ; // Save the current "try" context. + CFGBlock *PrevTryTerminatedBlock = TryTerminatedBlock; SaveAndRestore save_try(TryTerminatedBlock); // Create a new block that will contain the try statement. @@ -1606,10 +1607,14 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) { // Add the terminator in the try block. TryTerminatedBlock->setTerminator(Terminator); + bool HasCatchAll = false; for (unsigned h = 0; h getNumHandlers(); ++h) { // The code after the try is the implicit successor. Succ = TrySuccessor; CXXCatchStmt *CS = Terminator->getHandler(h); + if (CS->getExceptionDecl() == 0) { + HasCatchAll = true; + } Block = NULL; CFGBlock *CatchBlock = VisitCXXCatchStmt(CS); if (CatchBlock == 0) @@ -1618,6 +1623,12 @@ CFGBlock *CFGBuilder::VisitCXXTryStmt(CXXTryStmt *Terminator) { // statement. AddSuccessor(TryTerminatedBlock, CatchBlock); } + if (!HasCatchAll) { + if (PrevTryTerminatedBlock) + AddSuccessor(TryTerminatedBlock, PrevTryTerminatedBlock); + else + AddSuccessor(TryTerminatedBlock, &cfg->getExit()); + } // The code after the try is the implicit successor. Succ = TrySuccessor; @@ -2037,8 +2048,11 @@ static void print_block(llvm::raw_ostream& OS, const CFG* cfg, OS << "default"; else if (CXXCatchStmt *CS = dyn_cast(Label)) { OS << "catch ("; - CS->getExceptionDecl()->print(OS, PrintingPolicy(Helper->getLangOpts()), - 0); + if (CS->getExceptionDecl()) + CS->getExceptionDecl()->print(OS, PrintingPolicy(Helper->getLangOpts()), + 0); + else + OS << "..."; OS << ")"; } else