[cfe-commits] r77523 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/AST/DeclCXX.h include/clang/AST/DeclTemplate.h lib/AST/Decl.cpp lib/AST/DeclCXX.cpp lib/AST/DeclTemplate.cpp lib/Frontend/PCHReaderDecl.cpp lib/Frontend/PCHWriterDecl.cpp

Argyrios Kyrtzidis kyrtzidis at apple.com
Wed Jul 29 17:07:09 PDT 2009


Sorry about that, fixed now.

On Jul 29, 2009, at 5:04 PM, Fariborz Jahanian wrote:

> I am getting build failure:
>
> index-test.cpp: In function ‘void ProcessASTLocation 
> (clang::idx::ASTLocation, clang::idx::Indexer&)’:
> index-test.cpp:154: error: invalid use of incomplete type ‘const  
> struct clang::ObjCMethodDecl’
> /Volumes/sandbox/llvm/tools/clang/tools/index-test/../../include/ 
> clang/Index/SelectorMap.h:25: error: forward declaration of ‘const  
> struct clang::ObjCMethodDecl’
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h: In function  
> ‘bool llvm::isa_impl(const From&) [with To = clang::ObjCMethodDecl,  
> From = clang::Decl]’:
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:71:    
> instantiated from ‘static bool llvm::isa_impl_wrap<To, const FromTy,  
> const FromTy>::doit(const FromTy&) [with To = clang::ObjCMethodDecl,  
> FromTy = clang::Decl]’
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:83:    
> instantiated from ‘static bool llvm::isa_impl_cl<FromCl>::isa(const  
> FromCl&) [with ToCl = clang::ObjCMethodDecl, FromCl = clang::Decl]’
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:92:    
> instantiated from ‘static bool llvm::isa_impl_cl<const FromCl>::isa 
> (const FromCl&) [with ToCl = clang::ObjCMethodDecl, FromCl =  
> clang::Decl]’
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:101:    
> instantiated from ‘static bool llvm::isa_impl_cl<FromCl*>::isa 
> (FromCl*) [with ToCl = clang::ObjCMethodDecl, FromCl = const  
> clang::Decl]’
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:116:    
> instantiated from ‘bool llvm::isa(const Y&) [with X =  
> clang::ObjCMethodDecl, Y = const clang::Decl*]’
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:225:    
> instantiated from ‘typename llvm::cast_retty<To, From>::ret_type  
> llvm::dyn_cast(const Y&) [with X = clang::ObjCMethodDecl, Y = const  
> clang::Decl*]’
> index-test.cpp:153:   instantiated from here
> /Volumes/sandbox/llvm/include/llvm/Support/Casting.h:54: error:  
> incomplete type ‘clang::ObjCMethodDecl’ used in nested name specifier
> make[2]: *** [/Volumes/sandbox/llvm/tools/clang/tools/index-test/ 
> Debug/index-test.o] Error 1
>
>
> On Jul 29, 2009, at 4:36 PM, Douglas Gregor wrote:
>
>> Author: dgregor
>> Date: Wed Jul 29 18:36:44 2009
>> New Revision: 77523
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=77523&view=rev
>> Log:
>> Make tag declarations redeclarable. This change has three purposes:
>>
>> 1) Allow the Index library (and any other interested client) to walk
>> the set of declarations for a given tag (enum, union, class,
>> whatever). At the moment, this information is not readily available.
>>
>> 2) Reduce our dependence on TagDecl::TypeForDecl being mapped down
>> to a TagType (for which getDecl() will return the tag definition, if
>> one exists). This property won't exist for class template partial
>> specializations.
>>
>> 3) Make the canonical declaration of a TagDecl actually canonical,
>> e.g., so that it does not change when the tag is defined.
>>
>>
>> Modified:
>>   cfe/trunk/include/clang/AST/Decl.h
>>   cfe/trunk/include/clang/AST/DeclCXX.h
>>   cfe/trunk/include/clang/AST/DeclTemplate.h
>>   cfe/trunk/lib/AST/Decl.cpp
>>   cfe/trunk/lib/AST/DeclCXX.cpp
>>   cfe/trunk/lib/AST/DeclTemplate.cpp
>>   cfe/trunk/lib/Frontend/PCHReaderDecl.cpp
>>   cfe/trunk/lib/Frontend/PCHWriterDecl.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/Decl.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/Decl.h (original)
>> +++ cfe/trunk/include/clang/AST/Decl.h Wed Jul 29 18:36:44 2009
>> @@ -1178,7 +1178,8 @@
>> class TypedefDecl;
>>
>> /// TagDecl - Represents the declaration of a struct/union/class/ 
>> enum.
>> -class TagDecl : public TypeDecl, public DeclContext {
>> +class TagDecl
>> +  : public TypeDecl, public DeclContext, public  
>> Redeclarable<TagDecl> {
>> public:
>>  enum TagKind {
>>    TK_struct,
>> @@ -1205,15 +1206,28 @@
>>
>> protected:
>>  TagDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L,
>> -          IdentifierInfo *Id, SourceLocation TKL = SourceLocation())
>> +          IdentifierInfo *Id, TagDecl *PrevDecl,
>> +          SourceLocation TKL = SourceLocation())
>>    : TypeDecl(DK, DC, L, Id), DeclContext(DK), TypedefForAnonDecl(0),
>>      TagKeywordLoc(TKL) {
>>    assert((DK != Enum || TK == TK_enum) &&"EnumDecl not matched  
>> with TK_enum");
>>    TagDeclKind = TK;
>>    IsDefinition = false;
>> +    setPreviousDeclaration(PrevDecl);
>>  }
>> +
>> +  typedef Redeclarable<TagDecl> redeclarable_base;
>> +  virtual TagDecl *getNextRedeclaration() { return  
>> RedeclLink.getNext(); }
>> +
>> public:
>> -
>> +  typedef redeclarable_base::redecl_iterator redecl_iterator;
>> +  redecl_iterator redecls_begin() const {
>> +    return redeclarable_base::redecls_begin();
>> +  }
>> +  redecl_iterator redecls_end() const {
>> +    return redeclarable_base::redecls_end();
>> +  }
>> +
>>  SourceLocation getRBraceLoc() const { return RBraceLoc; }
>>  void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
>>
>> @@ -1307,8 +1321,8 @@
>>  EnumDecl *InstantiatedFrom;
>>
>>  EnumDecl(DeclContext *DC, SourceLocation L,
>> -           IdentifierInfo *Id, SourceLocation TKL)
>> -    : TagDecl(Enum, TK_enum, DC, L, Id, TKL), InstantiatedFrom(0) {
>> +           IdentifierInfo *Id, EnumDecl *PrevDecl, SourceLocation  
>> TKL)
>> +    : TagDecl(Enum, TK_enum, DC, L, Id, PrevDecl, TKL),  
>> InstantiatedFrom(0) {
>>      IntegerType = QualType();
>>    }
>> public:
>> @@ -1380,7 +1394,8 @@
>>
>> protected:
>>  RecordDecl(Kind DK, TagKind TK, DeclContext *DC,
>> -             SourceLocation L, IdentifierInfo *Id, SourceLocation  
>> TKL);
>> +             SourceLocation L, IdentifierInfo *Id,
>> +             RecordDecl *PrevDecl, SourceLocation TKL);
>>  virtual ~RecordDecl();
>>
>> public:
>>
>> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
>> +++ cfe/trunk/include/clang/AST/DeclCXX.h Wed Jul 29 18:36:44 2009
>> @@ -376,6 +376,7 @@
>> protected:
>>  CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC,
>>                SourceLocation L, IdentifierInfo *Id,
>> +                CXXRecordDecl *PrevDecl,
>>                SourceLocation TKL = SourceLocation());
>>
>>  ~CXXRecordDecl();
>>
>> Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
>> +++ cfe/trunk/include/clang/AST/DeclTemplate.h Wed Jul 29 18:36:44  
>> 2009
>> @@ -883,7 +883,8 @@
>>  ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK,
>>                                  DeclContext *DC, SourceLocation L,
>>                                  ClassTemplateDecl  
>> *SpecializedTemplate,
>> -                                  TemplateArgumentListBuilder  
>> &Builder);
>> +                                  TemplateArgumentListBuilder  
>> &Builder,
>> +                                  ClassTemplateSpecializationDecl  
>> *PrevDecl);
>>
>> public:
>>  static ClassTemplateSpecializationDecl *
>> @@ -954,9 +955,12 @@
>>                                         DeclContext *DC,  
>> SourceLocation L,
>>                                         TemplateParameterList  
>> *Params,
>>                                         ClassTemplateDecl  
>> *SpecializedTemplate,
>> -                                          
>> TemplateArgumentListBuilder &Builder)
>> -    : ClassTemplateSpecializationDecl(Context,  
>> ClassTemplatePartialSpecialization,
>> -                                      DC, L, SpecializedTemplate,  
>> Builder),
>> +                                          
>> TemplateArgumentListBuilder &Builder,
>> +                                
>> ClassTemplatePartialSpecializationDecl *PrevDecl)
>> +    : ClassTemplateSpecializationDecl(Context,
>> +                                       
>> ClassTemplatePartialSpecialization,
>> +                                      DC, L, SpecializedTemplate,  
>> Builder,
>> +                                      PrevDecl),
>>      TemplateParams(Params) { }
>>
>> public:
>>
>> Modified: cfe/trunk/lib/AST/Decl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/AST/Decl.cpp (original)
>> +++ cfe/trunk/lib/AST/Decl.cpp Wed Jul 29 18:36:44 2009
>> @@ -184,7 +184,7 @@
>> EnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC,  
>> SourceLocation L,
>>                           IdentifierInfo *Id, SourceLocation TKL,
>>                           EnumDecl *PrevDecl) {
>> -  EnumDecl *Enum = new (C) EnumDecl(DC, L, Id, TKL);
>> +  EnumDecl *Enum = new (C) EnumDecl(DC, L, Id, PrevDecl, TKL);
>>  C.getTypeDeclType(Enum, PrevDecl);
>>  return Enum;
>> }
>> @@ -662,33 +662,38 @@
>> }
>>
>> TagDecl* TagDecl::getCanonicalDecl() {
>> -  Type *T = getTypeForDecl();
>> -  if (T == 0)
>> -    T = getASTContext().getTagDeclType(this).getTypePtr();
>> -
>> -  return cast<TagDecl>(cast<TagType>(T->getCanonicalTypeInternal 
>> ())->getDecl());
>> +  return getFirstDeclaration();
>> }
>>
>> void TagDecl::startDefinition() {
>> -  TagType *TagT = const_cast<TagType *>(TypeForDecl->getAs<TagType> 
>> ());
>> -  TagT->decl.setPointer(this);
>> -  TagT->getAs<TagType>()->decl.setInt(1);
>> +  if (TagType *TagT = const_cast<TagType *>(TypeForDecl- 
>> >getAs<TagType>())) {
>> +    TagT->decl.setPointer(this);
>> +    TagT->decl.setInt(1);
>> +  }
>> }
>>
>> void TagDecl::completeDefinition() {
>> -  assert((!TypeForDecl ||
>> -          TypeForDecl->getAs<TagType>()->decl.getPointer() ==  
>> this) &&
>> -         "Attempt to redefine a tag definition?");
>>  IsDefinition = true;
>> -  TagType *TagT = const_cast<TagType *>(TypeForDecl->getAs<TagType> 
>> ());
>> -  TagT->decl.setPointer(this);
>> -  TagT->decl.setInt(0);
>> +  if (TagType *TagT = const_cast<TagType *>(TypeForDecl- 
>> >getAs<TagType>())) {
>> +    assert(TagT->decl.getPointer() == this &&
>> +           "Attempt to redefine a tag definition?");
>> +    TagT->decl.setInt(0);
>> +  }
>> }
>>
>> TagDecl* TagDecl::getDefinition(ASTContext& C) const {
>> -  QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this));
>> -  TagDecl* D = cast<TagDecl>(T->getAs<TagType>()->getDecl());
>> -  return D->isDefinition() ? D : 0;
>> +  if (isDefinition())
>> +    return const_cast<TagDecl *>(this);
>> +
>> +  if (TagType *TagT = const_cast<TagType *>(TypeForDecl- 
>> >getAs<TagType>()))
>> +    return TagT->getDecl()->isDefinition()? TagT->getDecl() : 0;
>> +
>> +  for (redecl_iterator R = redecls_begin(), REnd = redecls_end();
>> +       R != REnd; ++R)
>> +    if (R->isDefinition())
>> +      return *R;
>> +
>> +  return 0;
>> }
>>
>> // 
>> = 
>> = 
>> = 
>> ----------------------------------------------------------------------= 
>> ==//
>> @@ -696,8 +701,9 @@
>> // 
>> = 
>> = 
>> = 
>> ----------------------------------------------------------------------= 
>> ==//
>>
>> RecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC,  
>> SourceLocation L,
>> -                       IdentifierInfo *Id, SourceLocation TKL)
>> -  : TagDecl(DK, TK, DC, L, Id, TKL) {
>> +                       IdentifierInfo *Id, RecordDecl *PrevDecl,
>> +                       SourceLocation TKL)
>> +  : TagDecl(DK, TK, DC, L, Id, PrevDecl, TKL) {
>>  HasFlexibleArrayMember = false;
>>  AnonymousStructOrUnion = false;
>>  HasObjectMember = false;
>> @@ -708,7 +714,7 @@
>>                               SourceLocation L, IdentifierInfo *Id,
>>                               SourceLocation TKL, RecordDecl*  
>> PrevDecl) {
>>
>> -  RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id, TKL);
>> +  RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id,  
>> PrevDecl, TKL);
>>  C.getTypeDeclType(R, PrevDecl);
>>  return R;
>> }
>>
>> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
>> +++ cfe/trunk/lib/AST/DeclCXX.cpp Wed Jul 29 18:36:44 2009
>> @@ -25,8 +25,9 @@
>>
>> CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC,
>>                             SourceLocation L, IdentifierInfo *Id,
>> +                             CXXRecordDecl *PrevDecl,
>>                             SourceLocation TKL)
>> -  : RecordDecl(K, TK, DC, L, Id, TKL),
>> +  : RecordDecl(K, TK, DC, L, Id, PrevDecl, TKL),
>>    UserDeclaredConstructor(false), UserDeclaredCopyConstructor 
>> (false),
>>    UserDeclaredCopyAssignment(false), UserDeclaredDestructor(false),
>>    Aggregate(true), PlainOldData(true), Polymorphic(false), Abstract 
>> (false),
>> @@ -41,7 +42,10 @@
>>                                     SourceLocation TKL,
>>                                     CXXRecordDecl* PrevDecl,
>>                                     bool DelayTypeCreation) {
>> -  CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TK, DC, L,  
>> Id, TKL);
>> +  CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TK, DC, L, Id,
>> +                                           PrevDecl, TKL);
>> +
>> +  // FIXME: DelayTypeCreation seems like such a hack
>>  if (!DelayTypeCreation)
>>    C.getTypeDeclType(R, PrevDecl);
>>  return R;
>>
>> Modified: cfe/trunk/lib/AST/DeclTemplate.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/AST/DeclTemplate.cpp (original)
>> +++ cfe/trunk/lib/AST/DeclTemplate.cpp Wed Jul 29 18:36:44 2009
>> @@ -369,13 +369,15 @@
>> ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK,
>>                                DeclContext *DC, SourceLocation L,
>>                                ClassTemplateDecl  
>> *SpecializedTemplate,
>> -                                TemplateArgumentListBuilder  
>> &Builder)
>> +                                TemplateArgumentListBuilder  
>> &Builder,
>> +                                ClassTemplateSpecializationDecl  
>> *PrevDecl)
>>  : CXXRecordDecl(DK,
>>                  SpecializedTemplate->getTemplatedDecl()->getTagKind 
>> (),
>>                  DC, L,
>>                  // FIXME: Should we use DeclarationName for the  
>> name of
>>                  // class template specializations?
>> -                  SpecializedTemplate->getIdentifier()),
>> +                  SpecializedTemplate->getIdentifier(),
>> +                  PrevDecl),
>>    SpecializedTemplate(SpecializedTemplate),
>>    TemplateArgs(Context, Builder, /*TakeArgs=*/true),
>>    SpecializationKind(TSK_Undeclared) {
>> @@ -392,7 +394,8 @@
>>                                                    
>> ClassTemplateSpecialization,
>>                                                   DC, L,
>>                                                    
>> SpecializedTemplate,
>> -                                                   Builder);
>> +                                                   Builder,
>> +                                                   PrevDecl);
>>  Context.getTypeDeclType(Result, PrevDecl);
>>  return Result;
>> }
>> @@ -411,7 +414,7 @@
>>    = new (Context)ClassTemplatePartialSpecializationDecl(Context,
>>                                                          DC, L,  
>> Params,
>>                                                           
>> SpecializedTemplate,
>> -                                                          Builder);
>> +                                                          Builder,  
>> PrevDecl);
>>  Result->setSpecializationKind(TSK_ExplicitSpecialization);
>>  Context.getTypeDeclType(Result, PrevDecl);
>>  return Result;
>>
>> Modified: cfe/trunk/lib/Frontend/PCHReaderDecl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReaderDecl.cpp?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Frontend/PCHReaderDecl.cpp (original)
>> +++ cfe/trunk/lib/Frontend/PCHReaderDecl.cpp Wed Jul 29 18:36:44 2009
>> @@ -112,6 +112,8 @@
>>
>> void PCHDeclReader::VisitTagDecl(TagDecl *TD) {
>>  VisitTypeDecl(TD);
>> +  TD->setPreviousDeclaration(
>> +                        cast_or_null<TagDecl>(Reader.GetDecl(Record 
>> [Idx++])));
>>  TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
>>  TD->setDefinition(Record[Idx++]);
>>  TD->setTypedefForAnonDecl(
>>
>> Modified: cfe/trunk/lib/Frontend/PCHWriterDecl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriterDecl.cpp?rev=77523&r1=77522&r2=77523&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Frontend/PCHWriterDecl.cpp (original)
>> +++ cfe/trunk/lib/Frontend/PCHWriterDecl.cpp Wed Jul 29 18:36:44 2009
>> @@ -109,6 +109,7 @@
>>
>> void PCHDeclWriter::VisitTagDecl(TagDecl *D) {
>>  VisitTypeDecl(D);
>> +  Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
>>  Record.push_back((unsigned)D->getTagKind()); // FIXME: stable  
>> encoding
>>  Record.push_back(D->isDefinition());
>>  Writer.AddDeclRef(D->getTypedefForAnonDecl(), Record);
>>
>>
>> _______________________________________________
>> 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