[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

Fariborz Jahanian fjahanian at apple.com
Wed Jul 29 17:04:45 PDT 2009


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