[cfe-commits] r57213 - in /cfe/trunk: include/clang/AST/DeclGroup.h lib/AST/DeclGroup.cpp

Ted Kremenek kremenek at apple.com
Mon Oct 6 15:17:16 PDT 2008


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;
 }





More information about the cfe-commits mailing list