[cfe-commits] r169531 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/AST/DeclObjC.h include/clang/Sema/Sema.h lib/Parse/ParseStmt.cpp lib/Sema/SemaDecl.cpp lib/Serialization/ASTReaderDecl.cpp lib/Serialization/ASTWriterDecl.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Thu Dec 6 11:44:44 PST 2012


On Dec 6, 2012, at 11:19 AM, Jordan Rose <jordan_rose at apple.com> 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 <akyrtzi at gmail.com> 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
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> 





More information about the cfe-commits mailing list