From 4c018663b22cb439de81b6bbce13fe132ae06acb Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Mon, 27 Apr 2009 21:33:24 +0000 Subject: Track down return statements in the handlers of a function-try-block of constructors. Meh ... llvm-svn: 70256 --- clang/lib/Sema/SemaDeclCXX.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'clang/lib/Sema/SemaDeclCXX.cpp') diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 87a518b5583..71d2f80cfc4 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2664,3 +2664,24 @@ void Sema::SetDeclDeleted(DeclPtrTy dcl, SourceLocation DelLoc) { } Fn->setDeleted(); } + +static void SearchForReturnInStmt(Sema &Self, Stmt *S) { + for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end(); CI != E; + ++CI) { + Stmt *SubStmt = *CI; + if (!SubStmt) + continue; + if (isa(SubStmt)) + Self.Diag(SubStmt->getSourceRange().getBegin(), + diag::err_return_in_constructor_handler); + if (!isa(SubStmt)) + SearchForReturnInStmt(Self, SubStmt); + } +} + +void Sema::DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock) { + for (unsigned I = 0, E = TryBlock->getNumHandlers(); I != E; ++I) { + CXXCatchStmt *Handler = TryBlock->getHandler(I); + SearchForReturnInStmt(*this, Handler); + } +} -- cgit v1.2.3