On Dec 6, 2012, at 11:19 AM, Jordan Rose <[email protected]> wrote:
> Wouldn't this just be isDefined() && !hasBody()? Or will that get things like > synthesized methods as well? You are thinking of isThisDeclarationADefinition() ? This depends on whether there is a body or not. There is a question of whether a skipped body should result in a definition instead of a declaration but I feel that this would be disruptive to clients not expecting skipped bodies. > > > On Dec 6, 2012, at 10:59 , Argyrios Kyrtzidis <[email protected]> wrote: > >> Author: akirtzidis >> Date: Thu Dec 6 12:59:10 2012 >> New Revision: 169531 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=169531&view=rev >> Log: >> Add a bit on FunctionDecl/ObjCMethodDecl to indicate if there was a body >> that was skipped by the parser. >> >> Modified: >> cfe/trunk/include/clang/AST/Decl.h >> cfe/trunk/include/clang/AST/DeclObjC.h >> cfe/trunk/include/clang/Sema/Sema.h >> cfe/trunk/lib/Parse/ParseStmt.cpp >> cfe/trunk/lib/Sema/SemaDecl.cpp >> cfe/trunk/lib/Serialization/ASTReaderDecl.cpp >> cfe/trunk/lib/Serialization/ASTWriterDecl.cpp >> >> Modified: cfe/trunk/include/clang/AST/Decl.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/Decl.h (original) >> +++ cfe/trunk/include/clang/AST/Decl.h Thu Dec 6 12:59:10 2012 >> @@ -1472,6 +1472,10 @@ >> bool IsLateTemplateParsed : 1; >> bool IsConstexpr : 1; >> >> + /// \brief Indicates if the function was a definition but its body was >> + /// skipped. >> + unsigned HasSkippedBody : 1; >> + >> /// \brief End part of this FunctionDecl's source range. >> /// >> /// We could compute the full range in getSourceRange(). However, when we're >> @@ -1782,6 +1786,10 @@ >> /// \brief Determines whether this is a global function. >> bool isGlobal() const; >> >> + /// \brief True if the function was a definition but its body was skipped. >> + bool hasSkippedBody() const { return HasSkippedBody; } >> + void setHasSkippedBody(bool Skipped = true) { HasSkippedBody = Skipped; } >> + >> void setPreviousDeclaration(FunctionDecl * PrevDecl); >> >> virtual const FunctionDecl *getCanonicalDecl() const; >> >> Modified: cfe/trunk/include/clang/AST/DeclObjC.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/DeclObjC.h (original) >> +++ cfe/trunk/include/clang/AST/DeclObjC.h Thu Dec 6 12:59:10 2012 >> @@ -159,6 +159,9 @@ >> /// method in the interface or its categories. >> unsigned IsOverriding : 1; >> >> + /// \brief Indicates if the method was a definition but its body was >> skipped. >> + unsigned HasSkippedBody : 1; >> + >> // Result type of this method. >> QualType MethodDeclType; >> >> @@ -429,6 +432,10 @@ >> void getOverriddenMethods( >> SmallVectorImpl<const ObjCMethodDecl *> &Overridden) >> const; >> >> + /// \brief True if the method was a definition but its body was skipped. >> + bool hasSkippedBody() const { return HasSkippedBody; } >> + void setHasSkippedBody(bool Skipped = true) { HasSkippedBody = Skipped; } >> + >> /// \brief Returns the property associated with this method's selector. >> /// >> /// Note that even if this particular method is not marked as a property >> >> Modified: cfe/trunk/include/clang/Sema/Sema.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Sema/Sema.h (original) >> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Dec 6 12:59:10 2012 >> @@ -1412,6 +1412,7 @@ >> void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope); >> Decl *ActOnFinishFunctionBody(Decl *Decl, Stmt *Body); >> Decl *ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation); >> + Decl *ActOnSkippedFunctionBody(Decl *Decl); >> >> /// ActOnFinishDelayedAttribute - Invoked when we have finished parsing an >> /// attribute for which parsing is delayed. >> >> Modified: cfe/trunk/lib/Parse/ParseStmt.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Parse/ParseStmt.cpp (original) >> +++ cfe/trunk/lib/Parse/ParseStmt.cpp Thu Dec 6 12:59:10 2012 >> @@ -2006,7 +2006,7 @@ >> if (SkipFunctionBodies && Actions.canSkipFunctionBody(Decl) && >> trySkippingFunctionBody()) { >> BodyScope.Exit(); >> - return Actions.ActOnFinishFunctionBody(Decl, 0); >> + return Actions.ActOnSkippedFunctionBody(Decl); >> } >> >> PrettyDeclStackTraceEntry CrashInfo(Actions, Decl, LBraceLoc, >> @@ -2049,7 +2049,7 @@ >> if (SkipFunctionBodies && Actions.canSkipFunctionBody(Decl) && >> trySkippingFunctionBody()) { >> BodyScope.Exit(); >> - return Actions.ActOnFinishFunctionBody(Decl, 0); >> + return Actions.ActOnSkippedFunctionBody(Decl); >> } >> >> SourceLocation LBraceLoc = Tok.getLocation(); >> >> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Dec 6 12:59:10 2012 >> @@ -8016,6 +8016,14 @@ >> return !FD->isConstexpr(); >> } >> >> +Decl *Sema::ActOnSkippedFunctionBody(Decl *Decl) { >> + if (FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl)) >> + FD->setHasSkippedBody(); >> + else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(Decl)) >> + MD->setHasSkippedBody(); >> + return ActOnFinishFunctionBody(Decl, 0); >> +} >> + >> Decl *Sema::ActOnFinishFunctionBody(Decl *D, Stmt *BodyArg) { >> return ActOnFinishFunctionBody(D, BodyArg, false); >> } >> >> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Dec 6 12:59:10 2012 >> @@ -528,6 +528,7 @@ >> FD->IsExplicitlyDefaulted = Record[Idx++]; >> FD->HasImplicitReturnZero = Record[Idx++]; >> FD->IsConstexpr = Record[Idx++]; >> + FD->HasSkippedBody = Record[Idx++]; >> FD->EndRangeLoc = ReadSourceLocation(Record, Idx); >> >> switch ((FunctionDecl::TemplatedKind)Record[Idx++]) { >> @@ -652,6 +653,7 @@ >> MD->setPropertyAccessor(Record[Idx++]); >> MD->setDefined(Record[Idx++]); >> MD->IsOverriding = Record[Idx++]; >> + MD->HasSkippedBody = Record[Idx++]; >> >> MD->IsRedeclaration = Record[Idx++]; >> MD->HasRedeclaration = Record[Idx++]; >> >> Modified: cfe/trunk/lib/Serialization/ASTWriterDecl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterDecl.cpp?rev=169531&r1=169530&r2=169531&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTWriterDecl.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTWriterDecl.cpp Thu Dec 6 12:59:10 2012 >> @@ -328,6 +328,7 @@ >> Record.push_back(D->isExplicitlyDefaulted()); >> Record.push_back(D->hasImplicitReturnZero()); >> Record.push_back(D->isConstexpr()); >> + Record.push_back(D->HasSkippedBody); >> Writer.AddSourceLocation(D->getLocEnd(), Record); >> >> Record.push_back(D->getTemplatedKind()); >> @@ -419,6 +420,7 @@ >> Record.push_back(D->isPropertyAccessor()); >> Record.push_back(D->isDefined()); >> Record.push_back(D->IsOverriding); >> + Record.push_back(D->HasSkippedBody); >> >> Record.push_back(D->IsRedeclaration); >> Record.push_back(D->HasRedeclaration); >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
