]> granicus.if.org Git - clang/commitdiff
Revert temporarily D29877 "Warn about unused static file scope function template...
authorVassil Vassilev <v.g.vassilev@gmail.com>
Tue, 11 Apr 2017 16:05:23 +0000 (16:05 +0000)
committerVassil Vassilev <v.g.vassilev@gmail.com>
Tue, 11 Apr 2017 16:05:23 +0000 (16:05 +0000)
We need to address cases (breaking libc++) such as

template <class _Up> static int __test(...);

template<typename _Tp>
auto v = __test<_Tp>(0);

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@299956 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.cpp
lib/Sema/SemaDecl.cpp
test/SemaCXX/warn-unused-filescoped.cpp

index f943ab565073f114ed25c4d68789f7f8bcefd8f2..294b56059b33bb5e44119642bb30b81bb709edf7 100644 (file)
@@ -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();
index 20d1e0c6da610a4b2a6819a4bcd61389d89eff28..02cbca8b2bbbac0b329398eae40e773237791e5e 100644 (file)
@@ -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
index bd9335d32103484d698571d169be7dbd4aa94012..18defee7d04a6fdb34d6ec964bbf808102defb7c 100644 (file)
@@ -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.