[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