summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVassil Vassilev <v.g.vassilev@gmail.com>2017-04-11 16:05:23 +0000
committerVassil Vassilev <v.g.vassilev@gmail.com>2017-04-11 16:05:23 +0000
commitc42bce809720790327691c48454a649db64ec737 (patch)
treeb39f52c87cca209ec8a3331425cee507ba0ceb12
parent28611acef913496941eac195b6500a292cad49f4 (diff)
downloadbcm5719-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.cpp14
-rw-r--r--clang/lib/Sema/SemaDecl.cpp9
-rw-r--r--clang/test/SemaCXX/warn-unused-filescoped.cpp16
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.
OpenPOWER on IntegriCloud