aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/DeclBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/DeclBase.cpp')
-rw-r--r--clang/lib/AST/DeclBase.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 66a727d..8c83c71 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -52,6 +52,8 @@
using namespace clang;
+static_assert(sizeof(Decl) <= 32, "Decl grew beyond 32 bytes!");
+
//===----------------------------------------------------------------------===//
// Statistics
//===----------------------------------------------------------------------===//
@@ -130,7 +132,7 @@ const char *Decl::getDeclKindName() const {
}
void Decl::setInvalidDecl(bool Invalid) {
- InvalidDecl = Invalid;
+ DeclCtxWithInvalidDeclAndHasAttrs.setInt(Invalid);
assert(!isa<TagDecl>(this) || !cast<TagDecl>(this)->isCompleteDefinition());
if (!Invalid) {
return;
@@ -334,7 +336,9 @@ void PrettyStackTraceDecl::print(raw_ostream &OS) const {
Decl::~Decl() = default;
void Decl::setDeclContext(DeclContext *DC) {
- DeclCtx = DC;
+ auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
+ InnerPtr.setPointer(DC);
+ DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
}
void Decl::setLexicalDeclContext(DeclContext *DC) {
@@ -364,12 +368,16 @@ void Decl::setLexicalDeclContext(DeclContext *DC) {
void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
ASTContext &Ctx) {
if (SemaDC == LexicalDC) {
- DeclCtx = SemaDC;
+ auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
+ InnerPtr.setPointer(SemaDC);
+ DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
} else {
auto *MDC = new (Ctx) Decl::MultipleDC();
MDC->SemanticDC = SemaDC;
MDC->LexicalDC = LexicalDC;
- DeclCtx = MDC;
+ auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
+ InnerPtr.setPointer(MDC);
+ DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
}
}
@@ -956,19 +964,24 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
}
void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
- assert(!HasAttrs && "Decl already contains attrs.");
+ assert(!hasAttrs() && "Decl already contains attrs.");
AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
assert(AttrBlank.empty() && "HasAttrs was wrong?");
AttrBlank = attrs;
- HasAttrs = true;
+ auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
+ InnerPtr.setInt(true);
+ DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
}
void Decl::dropAttrs() {
- if (!HasAttrs) return;
+ if (!hasAttrs())
+ return;
- HasAttrs = false;
+ auto InnerPtr = DeclCtxWithInvalidDeclAndHasAttrs.getPointer();
+ InnerPtr.setInt(false);
+ DeclCtxWithInvalidDeclAndHasAttrs.setPointer(InnerPtr);
getASTContext().eraseDeclAttrs(this);
}
@@ -996,7 +1009,7 @@ void Decl::addAttr(Attr *A) {
}
const AttrVec &Decl::getAttrs() const {
- assert(HasAttrs && "No attrs to get!");
+ assert(hasAttrs() && "No attrs to get!");
return getASTContext().getDeclAttrs(this);
}