From 401adfad4af45b083ad067f3ebec5cf23a1e91cf Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 7 Oct 2008 23:06:01 +0000 Subject: [PATCH] Add const_iterator to DeclGroup. Serialization for OwningDeclGroupRefs now works. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57272 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclGroup.h | 25 ++++++++++++++++++++++--- lib/AST/DeclGroup.cpp | 21 ++++++++++++--------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/include/clang/AST/DeclGroup.h b/include/clang/AST/DeclGroup.h index 0dac050ad2..3f7a60a303 100644 --- a/include/clang/AST/DeclGroup.h +++ b/include/clang/AST/DeclGroup.h @@ -38,14 +38,15 @@ public: void Destroy(ASTContext& C); unsigned size() const { return NumDecls; } + Decl*& operator[](unsigned i) { assert (i < NumDecls && "Out-of-bounds access."); return *((Decl**) (this+1)); } - const Decl*& operator[](unsigned i) const { + Decl* const& operator[](unsigned i) const { assert (i < NumDecls && "Out-of-bounds access."); - return *((const Decl**) (this+1)); + return *((Decl* const*) (this+1)); } /// Emit - Serialize a DeclGroup to Bitcode. @@ -72,6 +73,11 @@ public: : D((Decl*) (reinterpret_cast(dg) | DeclGroupKind)) {} typedef Decl** iterator; + typedef Decl* const * const_iterator; + + bool hasSolitaryDecl() const { + return getKind() == DeclKind; + } iterator begin() { if (getKind() == DeclKind) return D ? &D : 0; @@ -84,6 +90,18 @@ public: DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); return &G[0] + G.size(); } + + const_iterator begin() const { + if (getKind() == DeclKind) return D ? &D : 0; + DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); + return &G[0]; + } + + const_iterator end() const { + if (getKind() == DeclKind) return D ? &D + 1 : 0; + DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); + return &G[0] + G.size(); + } /// Emit - Serialize a DeclGroupRef to Bitcode. void Emit(llvm::Serializer& S) const; @@ -94,6 +112,7 @@ public: class DeclGroupOwningRef : public DeclGroupRef { public: + explicit DeclGroupOwningRef() : DeclGroupRef((Decl*)0) {} explicit DeclGroupOwningRef(Decl* d) : DeclGroupRef(d) {} explicit DeclGroupOwningRef(DeclGroup* dg) : DeclGroupRef(dg) {} @@ -113,7 +132,7 @@ public: void Emit(llvm::Serializer& S) const; /// Read - Deserialize a DeclGroupOwningRef from Bitcode. - static DeclGroupOwningRef ReadVal(llvm::Deserializer& D, ASTContext& C); + DeclGroupOwningRef& Read(llvm::Deserializer& D, ASTContext& C); }; } // end clang namespace diff --git a/lib/AST/DeclGroup.cpp b/lib/AST/DeclGroup.cpp index bd79fafc8f..5ddcd5954d 100644 --- a/lib/AST/DeclGroup.cpp +++ b/lib/AST/DeclGroup.cpp @@ -21,6 +21,7 @@ using namespace clang; DeclGroup* DeclGroup::Create(ASTContext& C, unsigned numdecls, Decl** decls) { + assert (numdecls > 0); unsigned size = sizeof(DeclGroup) + sizeof(Decl*) * numdecls; unsigned alignment = llvm::AlignOf::Alignment; void* mem = C.getAllocator().Allocate(size, alignment); @@ -46,7 +47,7 @@ DeclGroup* DeclGroup::Create(llvm::Deserializer& D, ASTContext& C) { return DG; } -DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) { +DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) : NumDecls(numdecls) { assert (numdecls > 0); assert (decls); memcpy(this+1, decls, numdecls * sizeof(*decls)); @@ -110,13 +111,15 @@ void DeclGroupOwningRef::Emit(llvm::Serializer& S) const { } } -DeclGroupOwningRef DeclGroupOwningRef::ReadVal(llvm::Deserializer& D, - ASTContext& C) { - if (D.ReadBool()) { - DeclGroupOwningRef DG(D.ReadOwnedPtr(C)); - return DG; +DeclGroupOwningRef& DeclGroupOwningRef::Read(llvm::Deserializer& Dezr, + ASTContext& C) { + + if (!Dezr.ReadBool()) + D = Dezr.ReadOwnedPtr(C); + else { + uintptr_t x = reinterpret_cast(Dezr.ReadOwnedPtr(C)); + D = reinterpret_cast(x | DeclGroupKind); } - - DeclGroupOwningRef DG(D.ReadOwnedPtr(C)); - return DG; + + return *this; } -- 2.40.0