From: Ted Kremenek Date: Tue, 2 Sep 2008 20:25:22 +0000 (+0000) Subject: RecordDecl: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a39da065766bdfeee3421a2e71f60ae579170fef;p=clang RecordDecl: - Added method 'isForwardDeclaration', a predicate method that returns true if a RecordDecl represents a forward declaration. - Added method 'getDefinitionDecl', a query method that returns a pointer to the RecordDecl that provides the actual definition of a struct/union. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55642 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index eda74f399f..28d7a57366 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -802,6 +802,7 @@ class RecordDecl : public TagDecl { /// (i.e., all forward declarations appear first in the chain). Note that /// one should make no other assumption about the order of the RecordDecl's /// within this chain with respect to the original source. + /// NOTE: This is *not* an owning reference. RecordDecl* NextDecl; /// Members/NumMembers - This is a new[]'d array of pointers to Decls. @@ -821,6 +822,18 @@ public: 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. + const RecordDecl* getDefinitionDecl() const; + bool hasFlexibleArrayMember() const { return HasFlexibleArrayMember; } void setHasFlexibleArrayMember(bool V) { HasFlexibleArrayMember = V; } diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index c2ae5d91ab..4b4aa65f90 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -160,6 +160,18 @@ RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, 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,