forked from OSchip/llvm-project
Add a bit on FunctionDecl/ObjCMethodDecl to indicate if there was a body
that was skipped by the parser. llvm-svn: 169531
This commit is contained in:
parent
b10aae3fec
commit
1eb71a1ba7
|
@ -1472,6 +1472,10 @@ private:
|
|||
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 @@ public:
|
|||
/// \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;
|
||||
|
|
|
@ -159,6 +159,9 @@ private:
|
|||
/// 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 @@ public:
|
|||
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
|
||||
|
|
|
@ -1412,6 +1412,7 @@ public:
|
|||
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.
|
||||
|
|
|
@ -2006,7 +2006,7 @@ Decl *Parser::ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope) {
|
|||
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 @@ Decl *Parser::ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope) {
|
|||
if (SkipFunctionBodies && Actions.canSkipFunctionBody(Decl) &&
|
||||
trySkippingFunctionBody()) {
|
||||
BodyScope.Exit();
|
||||
return Actions.ActOnFinishFunctionBody(Decl, 0);
|
||||
return Actions.ActOnSkippedFunctionBody(Decl);
|
||||
}
|
||||
|
||||
SourceLocation LBraceLoc = Tok.getLocation();
|
||||
|
|
|
@ -8016,6 +8016,14 @@ bool Sema::canSkipFunctionBody(Decl *D) {
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -528,6 +528,7 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
|
|||
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 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
|
|||
MD->setPropertyAccessor(Record[Idx++]);
|
||||
MD->setDefined(Record[Idx++]);
|
||||
MD->IsOverriding = Record[Idx++];
|
||||
MD->HasSkippedBody = Record[Idx++];
|
||||
|
||||
MD->IsRedeclaration = Record[Idx++];
|
||||
MD->HasRedeclaration = Record[Idx++];
|
||||
|
|
|
@ -328,6 +328,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
|
|||
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 @@ void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
|
|||
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);
|
||||
|
|
Loading…
Reference in New Issue