From: Ted Kremenek Date: Tue, 2 Sep 2008 21:12:32 +0000 (+0000) Subject: RecordDecl: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6359792ca92e7ca2f416cb804c6604358174e994;p=clang RecordDecl: - Remove method 'isForwardDecl'; this functionality is already provided by 'isDefinition()' - Move method definitions to be co-located with other RecordDecl methods. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55649 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 28d7a57366..9688ea3e8c 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -821,14 +821,7 @@ public: RecordDecl *PrevDecl); virtual void Destroy(ASTContext& C); - - /// isForwardDeclaration - Returns true if this RecordDecl represents a - /// forward declaration. - bool isForwardDeclaration() const { - assert ((!Members || NextDecl == 0) && "(Members != 0) => (NextDecl == 0)"); - return !Members; - } - + /// getDefinitionDecl - Returns the RecordDecl for the struct/union that /// represents the actual definition (i.e., not a forward declaration). /// This method returns NULL if no such RecordDecl exists. diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 4b4aa65f90..04cec6f66b 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -114,65 +114,6 @@ void EnumDecl::Destroy(ASTContext& C) { Decl::Destroy(C); } -//==------------------------------------------------------------------------==// -// RecordDecl methods. -//==------------------------------------------------------------------------==// - -RecordDecl::RecordDecl(Kind DK, DeclContext *DC, SourceLocation L, - IdentifierInfo *Id, RecordDecl *PrevDecl) - : TagDecl(DK, DC, L, Id, 0), NextDecl(0) { - - HasFlexibleArrayMember = false; - assert(classof(static_cast(this)) && "Invalid Kind!"); - Members = 0; - NumMembers = -1; - - // Hook up the RecordDecl chain. - if (PrevDecl) { - RecordDecl* Tmp = PrevDecl->NextDecl; - // 'Tmp' might be non-NULL if it is the RecordDecl that provides the - // definition of the struct/union. By construction, the last RecordDecl - // in the chain is the 'defining' RecordDecl. - if (Tmp) { - assert (Tmp->NextDecl == 0); - assert (Tmp->Members && "Previous RecordDecl has a NextDecl that is " - "not the 'defining' RecordDecl"); - - NextDecl = Tmp; - } - - PrevDecl->NextDecl = this; - } -} - -RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, - SourceLocation L, IdentifierInfo *Id, - RecordDecl *PrevDecl) { - void *Mem = C.getAllocator().Allocate(); - Kind DK; - switch (TK) { - default: assert(0 && "Invalid TagKind!"); - case TK_enum: assert(0 && "Enum TagKind passed for Record!"); - case TK_struct: DK = Struct; break; - case TK_union: DK = Union; break; - case TK_class: DK = Class; break; - } - return new (Mem) RecordDecl(DK, DC, L, Id, PrevDecl); -} - -/// getDefinitionDecl - Returns the RecordDecl for the struct/union that -/// represents the actual definition (i.e., not a forward declaration). -/// This method returns NULL if no such RecordDecl exists. -const RecordDecl* RecordDecl::getDefinitionDecl() const { - const RecordDecl* R = this; - - for (RecordDecl* N = R->NextDecl; N; N = R->NextDecl) - R = N; - - return R->Members ? R : 0; -} - - FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, SourceLocation L, StringLiteral *Str) { @@ -262,6 +203,49 @@ unsigned FunctionDecl::getMinRequiredArguments() const { // RecordDecl Implementation //===----------------------------------------------------------------------===// +RecordDecl::RecordDecl(Kind DK, DeclContext *DC, SourceLocation L, + IdentifierInfo *Id, RecordDecl *PrevDecl) +: TagDecl(DK, DC, L, Id, 0), NextDecl(0) { + + HasFlexibleArrayMember = false; + assert(classof(static_cast(this)) && "Invalid Kind!"); + Members = 0; + NumMembers = -1; + + // Hook up the RecordDecl chain. + if (PrevDecl) { + RecordDecl* Tmp = PrevDecl->NextDecl; + // 'Tmp' might be non-NULL if it is the RecordDecl that provides the + // definition of the struct/union. By construction, the last RecordDecl + // in the chain is the 'defining' RecordDecl. + if (Tmp) { + assert (Tmp->NextDecl == 0); + assert (Tmp->isDefinition() + && "Previous RecordDecl has a NextDecl that is " + "not the 'defining' RecordDecl"); + + NextDecl = Tmp; + } + + PrevDecl->NextDecl = this; + } +} + +RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, + SourceLocation L, IdentifierInfo *Id, + RecordDecl *PrevDecl) { + void *Mem = C.getAllocator().Allocate(); + Kind DK; + switch (TK) { + default: assert(0 && "Invalid TagKind!"); + case TK_enum: assert(0 && "Enum TagKind passed for Record!"); + case TK_struct: DK = Struct; break; + case TK_union: DK = Union; break; + case TK_class: DK = Class; break; + } + return new (Mem) RecordDecl(DK, DC, L, Id, PrevDecl); +} + RecordDecl::~RecordDecl() { delete[] Members; } @@ -274,7 +258,6 @@ void RecordDecl::Destroy(ASTContext& C) { TagDecl::Destroy(C); } - /// defineBody - When created, RecordDecl's correspond to a forward declared /// record. This method is used to mark the decl as being defined, with the /// specified contents. @@ -298,3 +281,16 @@ FieldDecl *RecordDecl::getMember(IdentifierInfo *II) { return Members[i]; return 0; } + +/// getDefinitionDecl - Returns the RecordDecl for the struct/union that +/// represents the actual definition (i.e., not a forward declaration). +/// This method returns NULL if no such RecordDecl exists. +const RecordDecl* RecordDecl::getDefinitionDecl() const { + const RecordDecl* R = this; + + for (RecordDecl* N = R->NextDecl; N; N = R->NextDecl) + R = N; + + return R->Members ? R : 0; +} +