From: Eli Friedman Date: Sun, 6 Dec 2009 20:50:05 +0000 (+0000) Subject: Move helper onto CXXMethodDecl. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d7d7f67c1dd8626520bb243d3928f59d32424534;p=clang Move helper onto CXXMethodDecl. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90716 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 340096c9dc..083284c908 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -870,6 +870,8 @@ public: return getType()->getAs()->getTypeQuals(); } + bool hasInlineBody() const; + // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return D->getKind() >= CXXMethod && D->getKind() <= CXXConversion; diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 5064ec5c73..766cb01814 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -644,6 +644,25 @@ QualType CXXMethodDecl::getThisType(ASTContext &C) const { return C.getPointerType(ClassTy); } +static bool MethodHasBody(const CXXMethodDecl *MD, const FunctionDecl *&fn) { + // Simple case: function has a body + if (MD->getBody(fn)) + return true; + + // Complex case: function is an instantiation of a function which has a + // body, but the definition hasn't been instantiated. + const FunctionDecl *PatternDecl = MD->getTemplateInstantiationPattern(); + if (PatternDecl && PatternDecl->getBody(fn)) + return true; + + return false; +} + +bool CXXMethodDecl::hasInlineBody() const { + const FunctionDecl *fn; + return MethodHasBody(this, fn) && !fn->isOutOfLine(); +} + CXXBaseOrMemberInitializer:: CXXBaseOrMemberInitializer(ASTContext &Context, DeclaratorInfo *DInfo, CXXConstructorDecl *C, diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 4c7b911934..088673916f 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -663,20 +663,6 @@ void ASTRecordLayoutBuilder::UpdateAlignment(unsigned NewAlignment) { Alignment = NewAlignment; } -static bool MethodHasBody(const CXXMethodDecl *MD, const FunctionDecl *&fn) { - // Simple case: function has a body - if (MD->getBody(fn)) - return true; - - // Complex case: function is an instantiation of a function which has a - // body, but the definition hasn't been instantiated. - const FunctionDecl *PatternDecl = MD->getTemplateInstantiationPattern(); - if (PatternDecl && PatternDecl->getBody(fn)) - return true; - - return false; -} - static const CXXMethodDecl *GetKeyFunction(const CXXRecordDecl *RD) { if (!RD->isDynamicClass()) return 0; @@ -695,9 +681,8 @@ static const CXXMethodDecl *GetKeyFunction(const CXXRecordDecl *RD) { // they don't have a body until they're defined. if (MD->isImplicit()) continue; - - const FunctionDecl *fn; - if (MethodHasBody(MD, fn) && !fn->isOutOfLine()) + + if (MD->hasInlineBody()) continue; // We found it.