diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-10-27 21:11:48 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-10-27 21:11:48 +0000 |
commit | 7ced9c8529b734e313f62a3b81189d6f402f6713 (patch) | |
tree | 285e8d2f98859e136af57377a329d8ad8eb40ca3 | |
parent | 0130f3cc4ccd5f46361c48d5fe94133d74619424 (diff) |
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
-rw-r--r-- | include/clang/AST/Decl.h | 5 | ||||
-rw-r--r-- | lib/AST/Decl.cpp | 9 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 2 |
4 files changed, 14 insertions, 6 deletions
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<CXXMethodDecl>(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<GNUInlineAttr>()) { // 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<CXXMethodDecl>(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<CXXMethodDecl>(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<GNUInlineAttr>()) { 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); |