[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