diff --git a/clang/Parse/ParseObjc.cpp b/clang/Parse/ParseObjc.cpp index 76a9a969b261..7cf551d0ae18 100644 --- a/clang/Parse/ParseObjc.cpp +++ b/clang/Parse/ParseObjc.cpp @@ -1175,7 +1175,7 @@ void Parser::ParseObjCMethodDefinition() { ExitScope(); // TODO: Pass argument information. - Actions.ActOnMethodDefBody(MDecl, FnBody.Val); + Actions.ActOnFinishFunctionBody(MDecl, FnBody.Val); } Parser::ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) { diff --git a/clang/Parse/ParseStmt.cpp b/clang/Parse/ParseStmt.cpp index 6836f10c5847..cb2a69171905 100644 --- a/clang/Parse/ParseStmt.cpp +++ b/clang/Parse/ParseStmt.cpp @@ -1046,5 +1046,5 @@ Parser::DeclTy *Parser::ParseFunctionStatementBody(DeclTy *Decl, ExitScope(); // TODO: Pass argument information. - return Actions.ActOnFunctionDefBody(Decl, FnBody.Val); + return Actions.ActOnFinishFunctionBody(Decl, FnBody.Val); } \ No newline at end of file diff --git a/clang/Sema/Sema.h b/clang/Sema/Sema.h index 190302df99cb..0aea99e2d507 100644 --- a/clang/Sema/Sema.h +++ b/clang/Sema/Sema.h @@ -191,8 +191,8 @@ private: virtual DeclTy *ActOnStartOfFunctionDef(Scope *S, Declarator &D); virtual void ObjcActOnStartOfMethodDef(Scope *S, DeclTy *D); - virtual DeclTy *ActOnFunctionDefBody(DeclTy *Decl, StmtTy *Body); - virtual void ActOnMethodDefBody(DeclTy *Decl, StmtTy *Body); + + virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtTy *Body); /// Scope actions. virtual void ActOnPopScope(SourceLocation Loc, Scope *S); diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp index e043fa19f62d..c0fb92c4207f 100644 --- a/clang/Sema/SemaDecl.cpp +++ b/clang/Sema/SemaDecl.cpp @@ -996,11 +996,14 @@ Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Declarator &D) { return FD; } -Sema::DeclTy *Sema::ActOnFunctionDefBody(DeclTy *D, StmtTy *Body) { - FunctionDecl *FD = static_cast(D); - FD->setBody((Stmt*)Body); - - assert(FD == CurFunctionDecl && "Function parsing confused"); +Sema::DeclTy *Sema::ActOnFinishFunctionBody(DeclTy *D, StmtTy *Body) { + Decl *dcl = static_cast(D); + if (FunctionDecl *FD = dyn_cast(dcl)) { + FD->setBody((Stmt*)Body); + assert(FD == CurFunctionDecl && "Function parsing confused"); + } else if (ObjcMethodDecl *MD = dyn_cast(dcl)) { + MD->setBody((Stmt*)Body); + } CurFunctionDecl = 0; // Verify and clean out per-function state. @@ -1025,37 +1028,7 @@ Sema::DeclTy *Sema::ActOnFunctionDefBody(DeclTy *D, StmtTy *Body) { } LabelMap.clear(); - return FD; -} - -void Sema::ActOnMethodDefBody(DeclTy *D, StmtTy *Body) { - ObjcMethodDecl *FD = static_cast(D); - FD->setBody((Stmt*)Body); - CurFunctionDecl = 0; - - // Verify and clean out per-function state. - - // TODO: This code block is common with ActOnFunctionDefBody and need be - // refactored. - // Check goto/label use. - for (llvm::DenseMap::iterator - I = LabelMap.begin(), E = LabelMap.end(); I != E; ++I) { - // Verify that we have no forward references left. If so, there was a goto - // or address of a label taken, but no definition of it. Label fwd - // definitions are indicated with a null substmt. - if (I->second->getSubStmt() == 0) { - LabelStmt *L = I->second; - // Emit error. - Diag(L->getIdentLoc(), diag::err_undeclared_label_use, L->getName()); - - // At this point, we have gotos that use the bogus label. Stitch it into - // the function body so that they aren't leaked and that the AST is well - // formed. - L->setSubStmt(new NullStmt(L->getIdentLoc())); - cast((Stmt*)Body)->push_back(L); - } - } - LabelMap.clear(); + return D; } /// ObjcActOnStartOfMethodDef - This routine sets up parameters; invisible diff --git a/clang/include/clang/Parse/Action.h b/clang/include/clang/Parse/Action.h index 7a725d1aca7a..24b3af70412b 100644 --- a/clang/include/clang/Parse/Action.h +++ b/clang/include/clang/Parse/Action.h @@ -141,14 +141,10 @@ public: /// ActOnFunctionDefBody - This is called when a function body has completed /// parsing. Decl is the DeclTy returned by ParseStartOfFunctionDef. - virtual DeclTy *ActOnFunctionDefBody(DeclTy *Decl, StmtTy *Body) { + virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtTy *Body) { return Decl; } - virtual void ActOnMethodDefBody(DeclTy *Decl, StmtTy *Body) { - return; - } - /// ActOnPopScope - This callback is called immediately before the specified /// scope is popped and deleted. virtual void ActOnPopScope(SourceLocation Loc, Scope *S) {}