From 798d119415323ebcd029ffe1e0fb442a4ca8adbb Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Sat, 13 Dec 2008 16:23:55 +0000 Subject: [PATCH] Some utilities for using the smart pointers in Actions, especially Sema. Convert a few functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60983 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/PrintParserCallbacks.cpp | 6 +++--- include/clang/Parse/Action.h | 19 +++++++++++++++---- lib/Parse/ParseDecl.cpp | 2 +- lib/Parse/ParseObjc.cpp | 6 +++--- lib/Parse/ParseStmt.cpp | 2 +- lib/Parse/Parser.cpp | 3 ++- lib/Sema/Sema.h | 10 +++++++--- lib/Sema/SemaDecl.cpp | 17 +++++++++-------- lib/Sema/SemaDeclCXX.cpp | 2 +- lib/Sema/SemaExprCXX.cpp | 2 +- 10 files changed, 43 insertions(+), 26 deletions(-) diff --git a/Driver/PrintParserCallbacks.cpp b/Driver/PrintParserCallbacks.cpp index 8ec45f2703..6546b08816 100644 --- a/Driver/PrintParserCallbacks.cpp +++ b/Driver/PrintParserCallbacks.cpp @@ -108,7 +108,7 @@ namespace { /// This allows ActOnDeclarator to register "xx" prior to parsing the /// initializer. The declaration above should still result in a warning, /// since the reference to "xx" is uninitialized. - virtual void AddInitializerToDecl(DeclTy *Dcl, ExprTy *Init) { + virtual void AddInitializerToDecl(DeclTy *Dcl, ExprArg Init) { llvm::cout << __FUNCTION__ << "\n"; } @@ -140,12 +140,12 @@ namespace { /// ActOnFunctionDefBody - This is called when a function body has completed /// parsing. Decl is the DeclTy returned by ParseStartOfFunctionDef. - virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtTy *Body) { + virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtArg Body) { llvm::cout << __FUNCTION__ << "\n"; return 0; } - virtual DeclTy *ActOnFileScopeAsmDecl(SourceLocation Loc, ExprTy *AsmString) { + virtual DeclTy *ActOnFileScopeAsmDecl(SourceLocation Loc, ExprArg AsmString) { llvm::cout << __FUNCTION__ << "\n"; return 0; } diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index 991bd49fe9..bfb32000d0 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -87,6 +87,17 @@ public: typedef ASTMultiPtr<&ActionBase::DeleteExpr> MultiExprArg; typedef ASTMultiPtr<&ActionBase::DeleteStmt> MultiStmtArg; + + // Utilities for Action implementations to return smart results. + + OwningExprResult ExprError() { return OwningExprResult(*this, true); } + OwningStmtResult StmtError() { return OwningStmtResult(*this, true); } + OwningExprResult ExprError(const DiagnosticBuilder&) { return ExprError(); } + OwningStmtResult StmtError(const DiagnosticBuilder&) { return StmtError(); } + + OwningExprResult ExprEmpty() { return OwningExprResult(*this, false); } + OwningStmtResult StmtEmpty() { return OwningStmtResult(*this, false); } + /// Statistics. virtual void PrintStats() const {} //===--------------------------------------------------------------------===// @@ -170,7 +181,7 @@ public: /// This allows ActOnDeclarator to register "xx" prior to parsing the /// initializer. The declaration above should still result in a warning, /// since the reference to "xx" is uninitialized. - virtual void AddInitializerToDecl(DeclTy *Dcl, ExprTy *Init) { + virtual void AddInitializerToDecl(DeclTy *Dcl, ExprArg Init) { return; } @@ -204,14 +215,14 @@ public: virtual void ObjCActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) { return; } - + /// ActOnFunctionDefBody - This is called when a function body has completed /// parsing. Decl is the DeclTy returned by ParseStartOfFunctionDef. - virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtTy *Body) { + virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtArg Body) { return Decl; } - virtual DeclTy *ActOnFileScopeAsmDecl(SourceLocation Loc, ExprTy *AsmString) { + virtual DeclTy *ActOnFileScopeAsmDecl(SourceLocation Loc, ExprArg AsmString) { return 0; } diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 201e9d3a74..ed15140274 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -294,7 +294,7 @@ ParseInitDeclaratorListAfterFirstDeclarator(Declarator &D) { SkipUntil(tok::semi); return 0; } - Actions.AddInitializerToDecl(LastDeclInGroup, Init.release()); + Actions.AddInitializerToDecl(LastDeclInGroup, move_convert(Init)); } else if (Tok.is(tok::l_paren)) { // Parse C++ direct initializer: '(' expression-list ')' SourceLocation LParenLoc = ConsumeParen(); diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 994e783741..5f2ebad6db 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -1364,12 +1364,12 @@ Parser::DeclTy *Parser::ParseObjCMethodDefinition() { // 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. BodyScope.Exit(); - + // TODO: Pass argument information. - Actions.ActOnFinishFunctionBody(MDecl, FnBody.release()); + Actions.ActOnFinishFunctionBody(MDecl, move_convert(FnBody)); return MDecl; } diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index ed4563bb6f..9f8771c919 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -1240,5 +1240,5 @@ Parser::DeclTy *Parser::ParseFunctionStatementBody(DeclTy *Decl, if (FnBody.isInvalid()) FnBody = Owned(Actions.ActOnCompoundStmt(L, R, 0, 0, false)); - return Actions.ActOnFinishFunctionBody(Decl, FnBody.release()); + return Actions.ActOnFinishFunctionBody(Decl, move_convert(FnBody)); } diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 1cd7c0e075..058182eee6 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -342,7 +342,8 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() { "top-level asm block"); if (!Result.isInvalid()) - return Actions.ActOnFileScopeAsmDecl(Tok.getLocation(), Result.release()); + return Actions.ActOnFileScopeAsmDecl(Tok.getLocation(), + move_convert(Result)); return 0; } case tok::at: diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 97e8507e9b..3a64486002 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -39,6 +39,7 @@ namespace clang { class DeclSpec; class NamedDecl; class ScopedDecl; + class Stmt; class Expr; class InitListExpr; class CallExpr; @@ -242,6 +243,9 @@ public: virtual void DeleteExpr(ExprTy *E); virtual void DeleteStmt(StmtTy *S); + OwningExprResult Owned(Expr* E) { return OwningExprResult(*this, E); } + OwningStmtResult Owned(Stmt* S) { return OwningStmtResult(*this, S); } + virtual void ActOnEndOfTranslationUnit(); //===--------------------------------------------------------------------===// @@ -268,7 +272,7 @@ public: virtual void ActOnParamDefaultArgument(DeclTy *param, SourceLocation EqualLoc, ExprTy *defarg); - void AddInitializerToDecl(DeclTy *dcl, ExprTy *init); + void AddInitializerToDecl(DeclTy *dcl, ExprArg init); void ActOnUninitializedDecl(DeclTy *dcl); virtual DeclTy *FinalizeDeclaratorGroup(Scope *S, DeclTy *Group); @@ -276,11 +280,11 @@ public: virtual DeclTy *ActOnStartOfFunctionDef(Scope *S, DeclTy *D); virtual void ObjCActOnStartOfMethodDef(Scope *S, DeclTy *D); - virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtTy *Body); + virtual DeclTy *ActOnFinishFunctionBody(DeclTy *Decl, StmtArg Body); virtual DeclTy *ActOnLinkageSpec(SourceLocation Loc, SourceLocation LBrace, SourceLocation RBrace, const char *Lang, unsigned StrSize, DeclTy *D); - virtual DeclTy *ActOnFileScopeAsmDecl(SourceLocation Loc, ExprTy *expr); + virtual DeclTy *ActOnFileScopeAsmDecl(SourceLocation Loc, ExprArg expr); /// Scope actions. virtual void ActOnPopScope(SourceLocation Loc, Scope *S); diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 2c5e46afa0..2890464657 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1884,9 +1884,9 @@ bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) { return true; } -void Sema::AddInitializerToDecl(DeclTy *dcl, ExprTy *init) { +void Sema::AddInitializerToDecl(DeclTy *dcl, ExprArg init) { Decl *RealDecl = static_cast(dcl); - Expr *Init = static_cast(init); + Expr *Init = static_cast(init.release()); assert(Init && "missing initializer"); // If there is no declaration, there was an error parsing it. Just ignore @@ -2281,10 +2281,11 @@ Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) { return FD; } -Sema::DeclTy *Sema::ActOnFinishFunctionBody(DeclTy *D, StmtTy *Body) { +Sema::DeclTy *Sema::ActOnFinishFunctionBody(DeclTy *D, StmtArg BodyArg) { Decl *dcl = static_cast(D); + Stmt *Body = static_cast(BodyArg.release()); if (FunctionDecl *FD = dyn_cast_or_null(dcl)) { - FD->setBody((Stmt*)Body); + FD->setBody(Body); assert(FD == getCurFunctionDecl() && "Function parsing confused"); } else if (ObjCMethodDecl *MD = dyn_cast_or_null(dcl)) { MD->setBody((Stmt*)Body); @@ -2309,7 +2310,7 @@ Sema::DeclTy *Sema::ActOnFinishFunctionBody(DeclTy *D, StmtTy *Body) { // formed. if (Body) { L->setSubStmt(new NullStmt(L->getIdentLoc())); - cast((Stmt*)Body)->push_back(L); + cast(Body)->push_back(L); } else { // The whole function wasn't parsed correctly, just delete this. delete L; @@ -3358,9 +3359,9 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, DeclTy *EnumDeclX, } Sema::DeclTy *Sema::ActOnFileScopeAsmDecl(SourceLocation Loc, - ExprTy *expr) { - StringLiteral *AsmString = cast((Expr*)expr); - + ExprArg expr) { + StringLiteral *AsmString = cast((Expr*)expr.release()); + return FileScopeAsmDecl::Create(Context, Loc, AsmString); } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 40fcecfb1c..c3e947d432 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1391,7 +1391,7 @@ void Sema::AddCXXDirectInitializerToDecl(DeclTy *Dcl, SourceLocation LParenLoc, assert(NumExprs == 1 && "Expected 1 expression"); // Set the init expression, handles conversions. - AddInitializerToDecl(Dcl, ExprTys[0]); + AddInitializerToDecl(Dcl, ExprArg(*this, ExprTys[0])); } /// PerformInitializationByConstructor - Perform initialization by diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index a32a6f68fa..e951016361 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -645,7 +645,7 @@ Sema::ActOnCXXConditionDeclarationExpr(Scope *S, SourceLocation StartLoc, DeclTy *Dcl = ActOnDeclarator(S, D, 0); if (!Dcl) return true; - AddInitializerToDecl(Dcl, AssignExprVal); + AddInitializerToDecl(Dcl, ExprArg(*this, AssignExprVal)); // Mark this variable as one that is declared within a conditional. if (VarDecl *VD = dyn_cast((Decl *)Dcl)) -- 2.40.0