summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2014-10-10 18:44:34 +0000
committerJohn McCall <rjmccall@apple.com>2014-10-10 18:44:34 +0000
commitc90c1498f0806c376fd288508a682ff661b41463 (patch)
tree37fac3074a26a3a3884161b0c06a6ec8612c8870 /clang/lib
parentb275797e31a3536f7b5b26be1f7b3d26726434c9 (diff)
downloadbcm5719-llvm-c90c1498f0806c376fd288508a682ff661b41463.tar.gz
bcm5719-llvm-c90c1498f0806c376fd288508a682ff661b41463.zip
Change how we distinguish bitfield widths, in-class
initializers, and captured VLA types so that we can answer questions like "is this a bit-field" without looking at the enclosing DeclContext. NFC. llvm-svn: 219522
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/Decl.cpp49
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp9
-rw-r--r--clang/lib/Serialization/ASTWriterDecl.cpp17
3 files changed, 30 insertions, 45 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index aec7059490c..e3e365ff0f3 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -3282,18 +3282,9 @@ bool FieldDecl::isAnonymousStructOrUnion() const {
return false;
}
-bool FieldDecl::isBitField() const {
- if (getInClassInitStyle() == ICIS_NoInit &&
- InitializerOrBitWidth.getPointer()) {
- assert(getDeclContext() && "No parent context for FieldDecl");
- return !getDeclContext()->isRecord() || !getParent()->isLambda();
- }
- return false;
-}
-
unsigned FieldDecl::getBitWidthValue(const ASTContext &Ctx) const {
assert(isBitField() && "not a bitfield");
- Expr *BitWidth = static_cast<Expr *>(InitializerOrBitWidth.getPointer());
+ Expr *BitWidth = static_cast<Expr *>(InitStorage.getPointer());
return BitWidth->EvaluateKnownConstInt(Ctx).getZExtValue();
}
@@ -3317,34 +3308,28 @@ unsigned FieldDecl::getFieldIndex() const {
}
SourceRange FieldDecl::getSourceRange() const {
- if (const Expr *E =
- static_cast<const Expr *>(InitializerOrBitWidth.getPointer()))
- return SourceRange(getInnerLocStart(), E->getLocEnd());
- return DeclaratorDecl::getSourceRange();
-}
+ switch (InitStorage.getInt()) {
+ // All three of these cases store an optional Expr*.
+ case ISK_BitWidthOrNothing:
+ case ISK_InClassCopyInit:
+ case ISK_InClassListInit:
+ if (const Expr *E = static_cast<const Expr *>(InitStorage.getPointer()))
+ return SourceRange(getInnerLocStart(), E->getLocEnd());
+ // FALLTHROUGH
-void FieldDecl::setBitWidth(Expr *Width) {
- assert(!InitializerOrBitWidth.getPointer() && !hasInClassInitializer() &&
- "bit width, initializer or captured type already set");
- InitializerOrBitWidth.setPointer(Width);
-}
-
-void FieldDecl::setInClassInitializer(Expr *Init) {
- assert(!InitializerOrBitWidth.getPointer() && hasInClassInitializer() &&
- "bit width, initializer or captured expr already set");
- InitializerOrBitWidth.setPointer(Init);
-}
-
-bool FieldDecl::hasCapturedVLAType() const {
- return getDeclContext()->isRecord() && getParent()->isLambda() &&
- InitializerOrBitWidth.getPointer();
+ case ISK_CapturedVLAType:
+ return DeclaratorDecl::getSourceRange();
+ }
+ llvm_unreachable("bad init storage kind");
}
void FieldDecl::setCapturedVLAType(const VariableArrayType *VLAType) {
assert(getParent()->isLambda() && "capturing type in non-lambda.");
- assert(!InitializerOrBitWidth.getPointer() && !hasInClassInitializer() &&
+ assert(InitStorage.getInt() == ISK_BitWidthOrNothing &&
+ InitStorage.getPointer() == nullptr &&
"bit width, initializer or captured type already set");
- InitializerOrBitWidth.setPointer(const_cast<VariableArrayType *>(VLAType));
+ InitStorage.setPointerAndInt(const_cast<VariableArrayType *>(VLAType),
+ ISK_CapturedVLAType);
}
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 1c52b200967..93cd932a618 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -1000,13 +1000,14 @@ void ASTDeclReader::VisitFieldDecl(FieldDecl *FD) {
VisitDeclaratorDecl(FD);
FD->Mutable = Record[Idx++];
if (int BitWidthOrInitializer = Record[Idx++]) {
- FD->InitializerOrBitWidth.setInt(BitWidthOrInitializer - 1);
- if (FD->getDeclContext()->isRecord() && FD->getParent()->isLambda()) {
+ FD->InitStorage.setInt(
+ static_cast<FieldDecl::InitStorageKind>(BitWidthOrInitializer - 1));
+ if (FD->InitStorage.getInt() == FieldDecl::ISK_CapturedVLAType) {
// Read captured variable length array.
- FD->InitializerOrBitWidth.setPointer(
+ FD->InitStorage.setPointer(
Reader.readType(F, Record, Idx).getAsOpaquePtr());
} else {
- FD->InitializerOrBitWidth.setPointer(Reader.ReadExpr(F));
+ FD->InitStorage.setPointer(Reader.ReadExpr(F));
}
}
if (!FD->getDeclName()) {
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index 0549851cbf2..489996825be 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -677,18 +677,17 @@ void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) {
VisitDeclaratorDecl(D);
Record.push_back(D->isMutable());
- if ((D->InitializerOrBitWidth.getInt() != ICIS_NoInit ||
- D->InitializerOrBitWidth.getPointer()) &&
- !D->hasCapturedVLAType()) {
- Record.push_back(D->InitializerOrBitWidth.getInt() + 1);
- Writer.AddStmt(static_cast<Expr *>(D->InitializerOrBitWidth.getPointer()));
- } else if (D->hasCapturedVLAType()) {
- Record.push_back(D->InitializerOrBitWidth.getInt() + 1);
+ if (D->InitStorage.getInt() == FieldDecl::ISK_BitWidthOrNothing &&
+ D->InitStorage.getPointer() == nullptr) {
+ Record.push_back(0);
+ } else if (D->InitStorage.getInt() == FieldDecl::ISK_CapturedVLAType) {
+ Record.push_back(D->InitStorage.getInt() + 1);
Writer.AddTypeRef(
- QualType(static_cast<Type *>(D->InitializerOrBitWidth.getPointer()), 0),
+ QualType(static_cast<Type *>(D->InitStorage.getPointer()), 0),
Record);
} else {
- Record.push_back(0);
+ Record.push_back(D->InitStorage.getInt() + 1);
+ Writer.AddStmt(static_cast<Expr *>(D->InitStorage.getPointer()));
}
if (!D->getDeclName())
Writer.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D), Record);
OpenPOWER on IntegriCloud