Wouldn't this just be isDefined() && !hasBody()? Or will that get things like synthesized methods as well?
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
