diff options
| author | John McCall <rjmccall@apple.com> | 2014-10-10 18:44:34 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2014-10-10 18:44:34 +0000 |
| commit | c90c1498f0806c376fd288508a682ff661b41463 (patch) | |
| tree | 37fac3074a26a3a3884161b0c06a6ec8612c8870 /clang/lib | |
| parent | b275797e31a3536f7b5b26be1f7b3d26726434c9 (diff) | |
| download | bcm5719-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.cpp | 49 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 17 |
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); |

