diff options
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 0bc0043ccb..8ae9311017 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -144,13 +144,8 @@ void EnumDecl::Destroy(ASTContext& C) { void EnumDecl::completeDefinition(ASTContext &C, QualType NewType) { assert(!isDefinition() && "Cannot redefine enums!"); - setDefinition(true); - IntegerType = NewType; - - // Let ASTContext know that this is the defining EnumDecl for this - // type. - C.setTagDefinition(this); + TagDecl::completeDefinition(); } FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, @@ -311,6 +306,20 @@ OverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { // TagDecl Implementation //===----------------------------------------------------------------------===// +void TagDecl::startDefinition() { + cast<TagType>(TypeForDecl)->decl.setPointer(this); + cast<TagType>(TypeForDecl)->decl.setInt(1); +} + +void TagDecl::completeDefinition() { + assert((!TypeForDecl || + cast<TagType>(TypeForDecl)->decl.getPointer() == this) && + "Attempt to redefine a tag definition?"); + IsDefinition = true; + cast<TagType>(TypeForDecl)->decl.setPointer(this); + cast<TagType>(TypeForDecl)->decl.setInt(0); +} + TagDecl* TagDecl::getDefinition(ASTContext& C) const { QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this)); TagDecl* D = cast<TagDecl>(cast<TagType>(T)->getDecl()); @@ -351,12 +360,7 @@ void RecordDecl::Destroy(ASTContext& C) { /// complete. void RecordDecl::completeDefinition(ASTContext& C) { assert(!isDefinition() && "Cannot redefine record!"); - - setDefinition(true); - - // Let ASTContext know that this is the defining RecordDecl for this - // type. - C.setTagDefinition(this); + TagDecl::completeDefinition(); } //===----------------------------------------------------------------------===// |