diff options
author | Vassil Vassilev <v.g.vassilev@gmail.com> | 2017-04-11 16:05:23 +0000 |
---|---|---|
committer | Vassil Vassilev <v.g.vassilev@gmail.com> | 2017-04-11 16:05:23 +0000 |
commit | c42bce809720790327691c48454a649db64ec737 (patch) | |
tree | b39f52c87cca209ec8a3331425cee507ba0ceb12 | |
parent | 28611acef913496941eac195b6500a292cad49f4 (diff) | |
download | bcm5719-llvm-c42bce809720790327691c48454a649db64ec737.tar.gz bcm5719-llvm-c42bce809720790327691c48454a649db64ec737.zip |
Revert temporarily D29877 "Warn about unused static file scope function template declarations."
We need to address cases (breaking libc++) such as
template <class _Up> static int __test(...);
template<typename _Tp>
auto v = __test<_Tp>(0);
llvm-svn: 299956
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unused-filescoped.cpp | 16 |
3 files changed, 7 insertions, 32 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index f943ab56507..294b56059b3 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -470,13 +470,6 @@ static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) { return true; if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { - // If this is a function template and none of its specializations is used, - // we should warn. - if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate()) - for (const auto *Spec : Template->specializations()) - if (ShouldRemoveFromUnused(SemaRef, Spec)) - return true; - // UnusedFileScopedDecls stores the first declaration. // The declaration may have become definition so check again. const FunctionDecl *DeclToCheck; @@ -500,13 +493,6 @@ static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) { VD->isUsableInConstantExpressions(SemaRef->Context)) return true; - if (VarTemplateDecl *Template = VD->getDescribedVarTemplate()) - // If this is a variable template and none of its specializations is used, - // we should warn. - for (const auto *Spec : Template->specializations()) - if (ShouldRemoveFromUnused(SemaRef, Spec)) - return true; - // UnusedFileScopedDecls stores the first declaration. // The declaration may have become definition so check again. const VarDecl *DeclToCheck = VD->getDefinition(); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 20d1e0c6da6..02cbca8b2bb 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -8887,7 +8887,6 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, if (FunctionTemplate) { if (NewFD->isInvalidDecl()) FunctionTemplate->setInvalidDecl(); - MarkUnusedFileScopedDecl(NewFD); return FunctionTemplate; } } @@ -10988,7 +10987,8 @@ static bool hasDependentAlignment(VarDecl *VD) { /// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform /// any semantic actions necessary after any initializer has been attached. -void Sema::FinalizeDeclaration(Decl *ThisDecl) { +void +Sema::FinalizeDeclaration(Decl *ThisDecl) { // Note that we are no longer parsing the initializer for this declaration. ParsingInitForAutoVars.erase(ThisDecl); @@ -11153,8 +11153,9 @@ void Sema::FinalizeDeclaration(Decl *ThisDecl) { if (DC->getRedeclContext()->isFileContext() && VD->isExternallyVisible()) AddPushedVisibilityAttribute(VD); - // FIXME: Warn on unused var template partial specializations. - if (VD->isFileVarDecl() && !isa<VarTemplatePartialSpecializationDecl>(VD)) + // FIXME: Warn on unused templates. + if (VD->isFileVarDecl() && !VD->getDescribedVarTemplate() && + !isa<VarTemplatePartialSpecializationDecl>(VD)) MarkUnusedFileScopedDecl(VD); // Now we have parsed the initializer and can update the table of magic diff --git a/clang/test/SemaCXX/warn-unused-filescoped.cpp b/clang/test/SemaCXX/warn-unused-filescoped.cpp index bd9335d3210..18defee7d04 100644 --- a/clang/test/SemaCXX/warn-unused-filescoped.cpp +++ b/clang/test/SemaCXX/warn-unused-filescoped.cpp @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -Wno-c++11-extensions -std=c++98 %s -// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -std=c++14 %s +// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -std=c++11 %s #ifdef HEADER @@ -65,7 +65,7 @@ namespace { template <> void TS<int>::m() { } // expected-warning{{unused}} template <typename T> - void tf() { } // expected-warning{{unused}} + void tf() { } template <> void tf<int>() { } // expected-warning{{unused}} struct VS { @@ -200,18 +200,6 @@ void bar() { void func() __attribute__((used)); } static void func() {} } -namespace test9 { -template<typename T> -static void completeRedeclChainForTemplateSpecialization() { } // expected-warning {{unused}} -} - -namespace test10 { -#if __cplusplus >= 201103L -template<class T> -constexpr T pi = T(3.14); // expected-warning {{unused}} -#endif -} - namespace pr19713 { #if __cplusplus >= 201103L // FIXME: We should warn on both of these. |