diff options
-rw-r--r-- | clang/Parse/ParseStmt.cpp | 18 | ||||
-rw-r--r-- | clang/Parse/Parser.cpp | 16 | ||||
-rw-r--r-- | clang/include/clang/Parse/Parser.h | 2 |
3 files changed, 21 insertions, 15 deletions
diff --git a/clang/Parse/ParseStmt.cpp b/clang/Parse/ParseStmt.cpp index 5e05f9a27d2..6836f10c584 100644 --- a/clang/Parse/ParseStmt.cpp +++ b/clang/Parse/ParseStmt.cpp @@ -1030,3 +1030,21 @@ void Parser::ParseAsmOperandsOpt() { ConsumeToken(); } } + +Parser::DeclTy *Parser::ParseFunctionStatementBody(DeclTy *Decl, + SourceLocation L, SourceLocation R) { + // Do not enter a scope for the brace, as the arguments are in the same scope + // (the function body) as the body itself. Instead, just read the statement + // list and put it into a CompoundStmt for safe keeping. + StmtResult FnBody = ParseCompoundStatementBody(); + + // If the function body could not be parsed, make a bogus compoundstmt. + if (FnBody.isInvalid) + FnBody = Actions.ActOnCompoundStmt(L, R, 0, 0, false); + + // Leave the function body scope. + ExitScope(); + + // TODO: Pass argument information. + return Actions.ActOnFunctionDefBody(Decl, FnBody.Val); +}
\ No newline at end of file diff --git a/clang/Parse/Parser.cpp b/clang/Parse/Parser.cpp index 8040eb8ebc4..a2ba86e9035 100644 --- a/clang/Parse/Parser.cpp +++ b/clang/Parse/Parser.cpp @@ -462,21 +462,7 @@ Parser::DeclTy *Parser::ParseFunctionDefinition(Declarator &D) { // specified Declarator for the function. DeclTy *Res = Actions.ActOnStartOfFunctionDef(CurScope, D); - - // Do not enter a scope for the brace, as the arguments are in the same scope - // (the function body) as the body itself. Instead, just read the statement - // list and put it into a CompoundStmt for safe keeping. - StmtResult FnBody = ParseCompoundStatementBody(); - - // If the function body could not be parsed, make a bogus compoundstmt. - if (FnBody.isInvalid) - FnBody = Actions.ActOnCompoundStmt(BraceLoc, BraceLoc, 0, 0, false); - - // Leave the function body scope. - ExitScope(); - - // TODO: Pass argument information. - return Actions.ActOnFunctionDefBody(Res, FnBody.Val); + return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc); } /// ParseKNRParamDeclarations - Parse 'declaration-list[opt]' which provides diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index b7476a77b60..7339d6ca504 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -397,6 +397,8 @@ private: DeclTy *ParseDeclaration(unsigned Context); DeclTy *ParseSimpleDeclaration(unsigned Context); DeclTy *ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D); + DeclTy *ParseFunctionStatementBody(DeclTy *Decl, + SourceLocation L, SourceLocation R); void ParseDeclarationSpecifiers(DeclSpec &DS); void ParseSpecifierQualifierList(DeclSpec &DS); |