BTW, I want to thank Mike Stump for being patient enough to explain more of the C++ strict-aliasing rules to me.
On Oct 6, 2008, at 3:17 PM, Ted Kremenek wrote: > Author: kremenek > Date: Mon Oct 6 17:17:16 2008 > New Revision: 57213 > > URL: http://llvm.org/viewvc/llvm-project?rev=57213&view=rev > Log: > Modified DeclGroupRef to always load/store the internal pointer > value as Decl*. This hopefully will obviate any concerns with > violating strict type-aliasing issues. > > Modified: > cfe/trunk/include/clang/AST/DeclGroup.h > cfe/trunk/lib/AST/DeclGroup.cpp > > Modified: cfe/trunk/include/clang/AST/DeclGroup.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclGroup.h?rev=57213&r1=57212&r2=57213&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/include/clang/AST/DeclGroup.h (original) > +++ cfe/trunk/include/clang/AST/DeclGroup.h Mon Oct 6 17:17:16 2008 > @@ -42,31 +42,35 @@ > } > }; > > + > class DeclGroupRef { > protected: > - enum Kind { DeclKind=0x0, DeclGroupKind=0x1, Mask=0x1 }; > - union { Decl* D; uintptr_t Raw; }; > - Kind getKind() const { return (Kind) (Raw & Mask); } > + enum Kind { DeclKind=0x0, DeclGroupKind=0x1, Mask=0x1 }; > + Decl* D; > + > + Kind getKind() const { > + return (Kind) (reinterpret_cast<uintptr_t>(D) & Mask); > + } > > public: > - DeclGroupRef() : Raw(0) {} > + DeclGroupRef() : D(0) {} > > explicit DeclGroupRef(Decl* d) : D(d) {} > explicit DeclGroupRef(DeclGroup* dg) > - : Raw(reinterpret_cast<uintptr_t>(dg) | DeclGroupKind) {} > + : D((Decl*) (reinterpret_cast<uintptr_t>(D) | DeclGroupKind)) {} > > typedef Decl** iterator; > > iterator begin() { > - if (getKind() == DeclKind) return Raw ? &D : 0; > - DeclGroup* G = reinterpret_cast<DeclGroup*>(Raw & ~Mask); > - return &(*G)[0]; > + if (getKind() == DeclKind) return D ? &D : 0; > + DeclGroup& G = *((DeclGroup*) (reinterpret_cast<uintptr_t>(D) & > ~Mask)); > + return &G[0]; > } > > iterator end() { > - if (getKind() == DeclKind) return Raw ? &D + 1 : 0; > - DeclGroup* G = reinterpret_cast<DeclGroup*>(Raw & ~Mask); > - return &(*G)[0] + G->size(); > + if (getKind() == DeclKind) return D ? &D + 1 : 0; > + DeclGroup& G = *((DeclGroup*) (reinterpret_cast<uintptr_t>(D) & > ~Mask)); > + return &G[0] + G.size(); > } > }; > > @@ -76,11 +80,11 @@ > void Destroy(ASTContext& C); > > explicit DeclGroupOwningRef(DeclGroupOwningRef& R) > - : DeclGroupRef(R) { R.Raw = 0; } > + : DeclGroupRef(R) { R.D = 0; } > > DeclGroupOwningRef& operator=(DeclGroupOwningRef& R) { > - Raw = R.Raw; > - R.Raw = 0; > + D = R.D; > + R.D = 0; > return *this; > } > }; > > Modified: cfe/trunk/lib/AST/DeclGroup.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclGroup.cpp?rev=57213&r1=57212&r2=57213&view=diff > > = > = > = > = > = > = > = > = > ====================================================================== > --- cfe/trunk/lib/AST/DeclGroup.cpp (original) > +++ cfe/trunk/lib/AST/DeclGroup.cpp Mon Oct 6 17:17:16 2008 > @@ -43,17 +43,18 @@ > } > > DeclGroupOwningRef::~DeclGroupOwningRef() { > - assert (Raw == 0 && "Destroy method not called."); > + assert (D == 0 && "Destroy method not called."); > } > > void DeclGroupOwningRef::Destroy(ASTContext& C) { > - if (!Raw) > + if (!D) > return; > > if (getKind() == DeclKind) > - reinterpret_cast<Decl*>(Raw)->Destroy(C); > - else > - reinterpret_cast<DeclGroup*>(Raw & ~Mask)->Destroy(C); > + D->Destroy(C); > + else > + reinterpret_cast<DeclGroup*>(reinterpret_cast<uintptr_t>(D) & > + ~Mask)->Destroy(C); > > - Raw = 0; > + D = 0; > } > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
