From 0f764e57fc481bc7ca92e4f6e45f0a2d8b487bb2 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Tue, 7 Apr 2015 20:46:51 +0000 Subject: [PATCH] Revert "Mark instantiated function decls as inline specified if any pattern is" It breaks down on this test case: void foo(); template class C { friend void foo(); }; inline void foo() {} C c; We shouldn't be marking the instantiation of the friend decl of foo as inline-specified. It may be possible to fix this by determining if the full definition is part of the current template, but it seems better to rever tot green until we come up with a full solution. This reverts commit r233817, as well as follow-ups r233820 and r233821. llvm-svn: 234355 --- .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 20 +++-------- clang/test/CodeGenCXX/inlinehint.cpp | 33 ------------------- 2 files changed, 5 insertions(+), 48 deletions(-) delete mode 100644 clang/test/CodeGenCXX/inlinehint.cpp diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 677c3b8bb1d7..6936539f1caa 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(D)) { Method = CXXDestructorDecl::Create(SemaRef.Context, Record, StartLoc, NameInfo, T, TInfo, - isAnyRedeclInlineSpecified(Destructor), + Destructor->isInlineSpecified(), false); } else if (CXXConversionDecl *Conversion = dyn_cast(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 2b984c3a2e00..000000000000 --- 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 -struct MyTemplate { - static void InlineStaticMethod(); - void InlineInstanceMethod(); -}; -template inline void MyTemplate::InlineStaticMethod() {} -// CHECK: define linkonce_odr void @_ZN10MyTemplateIiE18InlineStaticMethodEv() #[[INLINEHINTATTR]] -template inline void MyTemplate::InlineInstanceMethod() {} -// CHECK: define linkonce_odr void @_ZN10MyTemplateIiE20InlineInstanceMethodEv(%struct.MyTemplate* %this) #[[INLINEHINTATTR]] - -void UseThem() { - InlineFunc(); - MyClass::InlineStaticMethod(); - MyClass().InlineInstanceMethod(); - MyTemplate::InlineStaticMethod(); - MyTemplate().InlineInstanceMethod(); -} - -// CHECK: attributes #[[INLINEHINTATTR]] = { {{.*}}inlinehint{{.*}} }