diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 20 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/inlinehint.cpp | 33 |
2 files changed, 5 insertions, 48 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 677c3b8bb1d..6936539f1ca 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -1304,15 +1304,6 @@ static QualType adjustFunctionTypeForInstantiation(ASTContext &Context, NewFunc->getParamTypes(), NewEPI); } -/// Return true if any redeclaration of FD was inline specified. Useful for -/// propagating the 'inline' specifier onto function template instantiations. -static bool isAnyRedeclInlineSpecified(const FunctionDecl *FD) { - for (const auto *R : FD->redecls()) - if (R->isInlineSpecified()) - return true; - return false; -} - /// Normal class members are of more specific types and therefore /// don't make it here. This function serves two purposes: /// 1) instantiating function templates @@ -1381,8 +1372,7 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D, FunctionDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(), D->getNameInfo(), T, TInfo, D->getCanonicalDecl()->getStorageClass(), - isAnyRedeclInlineSpecified(D), - D->hasWrittenPrototype(), + D->isInlineSpecified(), D->hasWrittenPrototype(), D->isConstexpr()); Function->setRangeEnd(D->getSourceRange().getEnd()); @@ -1679,7 +1669,7 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, Method = CXXConstructorDecl::Create(SemaRef.Context, Record, StartLoc, NameInfo, T, TInfo, Constructor->isExplicit(), - isAnyRedeclInlineSpecified(Constructor), + Constructor->isInlineSpecified(), false, Constructor->isConstexpr()); // Claim that the instantiation of a constructor or constructor template @@ -1714,12 +1704,12 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(D)) { Method = CXXDestructorDecl::Create(SemaRef.Context, Record, StartLoc, NameInfo, T, TInfo, - isAnyRedeclInlineSpecified(Destructor), + Destructor->isInlineSpecified(), false); } else if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) { Method = CXXConversionDecl::Create(SemaRef.Context, Record, StartLoc, NameInfo, T, TInfo, - isAnyRedeclInlineSpecified(Conversion), + Conversion->isInlineSpecified(), Conversion->isExplicit(), Conversion->isConstexpr(), Conversion->getLocEnd()); @@ -1727,7 +1717,7 @@ TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, StorageClass SC = D->isStatic() ? SC_Static : SC_None; Method = CXXMethodDecl::Create(SemaRef.Context, Record, StartLoc, NameInfo, T, TInfo, - SC, isAnyRedeclInlineSpecified(D), + SC, D->isInlineSpecified(), D->isConstexpr(), D->getLocEnd()); } diff --git a/clang/test/CodeGenCXX/inlinehint.cpp b/clang/test/CodeGenCXX/inlinehint.cpp deleted file mode 100644 index 2b984c3a2e0..00000000000 --- a/clang/test/CodeGenCXX/inlinehint.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-linux %s -emit-llvm -o - | FileCheck %s - -inline void InlineFunc() {} -// CHECK: define linkonce_odr void @_Z10InlineFuncv() #[[INLINEHINTATTR:[0-9]+]] - -struct MyClass { - static void InlineStaticMethod(); - void InlineInstanceMethod(); -}; -inline void MyClass::InlineStaticMethod() {} -// CHECK: define linkonce_odr void @_ZN7MyClass18InlineStaticMethodEv() #[[INLINEHINTATTR]] -inline void MyClass::InlineInstanceMethod() {} -// CHECK: define linkonce_odr void @_ZN7MyClass20InlineInstanceMethodEv(%struct.MyClass* %this) #[[INLINEHINTATTR]] - -template <typename T> -struct MyTemplate { - static void InlineStaticMethod(); - void InlineInstanceMethod(); -}; -template <typename T> inline void MyTemplate<T>::InlineStaticMethod() {} -// CHECK: define linkonce_odr void @_ZN10MyTemplateIiE18InlineStaticMethodEv() #[[INLINEHINTATTR]] -template <typename T> inline void MyTemplate<T>::InlineInstanceMethod() {} -// CHECK: define linkonce_odr void @_ZN10MyTemplateIiE20InlineInstanceMethodEv(%struct.MyTemplate* %this) #[[INLINEHINTATTR]] - -void UseThem() { - InlineFunc(); - MyClass::InlineStaticMethod(); - MyClass().InlineInstanceMethod(); - MyTemplate<int>::InlineStaticMethod(); - MyTemplate<int>().InlineInstanceMethod(); -} - -// CHECK: attributes #[[INLINEHINTATTR]] = { {{.*}}inlinehint{{.*}} } |

