From: Douglas Gregor Date: Tue, 27 Oct 2009 21:11:48 +0000 (+0000) Subject: Introduce FunctionDecl::isInlined() to tell whether a function should X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ced9c8529b734e313f62a3b81189d6f402f6713;p=clang Introduce FunctionDecl::isInlined() to tell whether a function should be inlined. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85307 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 8fbddadc5f..813e83accd 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -1051,6 +1051,11 @@ public: /// Set whether the "inline" keyword was specified for this function. void setInlineSpecified(bool I) { IsInline = I; } + /// \brief Determine whether this function should be inlined, because it is + /// either marked "inline" or is a member function of a C++ class that + /// was defined in the class body. + bool isInlined() const; + bool isInlineDefinitionExternallyVisible() const; /// isOverloadedOperator - Whether this function declaration diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 5dccb435a5..28d0a8357e 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -642,6 +642,10 @@ unsigned FunctionDecl::getMinRequiredArguments() const { return NumRequiredArgs; } +bool FunctionDecl::isInlined() const { + return isInlineSpecified() || (isa(this) && !isOutOfLine()); +} + /// \brief For an inline function definition in C, determine whether the /// definition will be externally visible. /// @@ -661,7 +665,7 @@ unsigned FunctionDecl::getMinRequiredArguments() const { /// externally visible symbol. bool FunctionDecl::isInlineDefinitionExternallyVisible() const { assert(isThisDeclarationADefinition() && "Must have the function definition"); - assert(isInlineSpecified() && "Function must be inline"); + assert(isInlined() && "Function must be inline"); if (!getASTContext().getLangOptions().C99 || hasAttr()) { // GNU inline semantics. Based on a number of examples, we came up with the @@ -786,8 +790,7 @@ bool FunctionDecl::isImplicitlyInstantiable() const { if (!Pattern || !PatternDecl) return true; - return PatternDecl->isInlineSpecified() || - (isa(PatternDecl) && !PatternDecl->isOutOfLine()); + return PatternDecl->isInlined(); } FunctionDecl *FunctionDecl::getTemplateInstantiationPattern() const { diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index dd31663983..a40701851e 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -262,7 +262,7 @@ GetLinkageForFunction(ASTContext &Context, const FunctionDecl *FD, if (const CXXMethodDecl *MD = dyn_cast(FD)) { // C++ member functions defined inside the class are always inline. - if (MD->isInlineSpecified() || !MD->isOutOfLine()) + if (MD->isInlined()) return CodeGenModule::GVA_CXXInline; return External; @@ -272,7 +272,7 @@ GetLinkageForFunction(ASTContext &Context, const FunctionDecl *FD, if (FD->getStorageClass() == FunctionDecl::Static) return CodeGenModule::GVA_Internal; - if (!FD->isInlineSpecified()) + if (!FD->isInlined()) return External; if (!Features.CPlusPlus || FD->hasAttr()) { diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 290df94861..17b99bca95 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1127,7 +1127,7 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // to which they refer. if (Function->getTemplateSpecializationKind() == TSK_ExplicitInstantiationDeclaration && - PatternDecl->isOutOfLine() && !PatternDecl->isInlineSpecified()) + !PatternDecl->isInlined()) return; InstantiatingTemplate Inst(*this, PointOfInstantiation, Function);