]> granicus.if.org Git - clang/commitdiff
Suppress unused warning on static inline function template specializations.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 16 Apr 2013 15:21:30 +0000 (15:21 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 16 Apr 2013 15:21:30 +0000 (15:21 +0000)
Patch by Halfdan Ingvarsson!

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

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

index a17e9d0cdafbfb418ed9c1ca5078bb05264530b1..c20b5ff068afb8a9d8cd75290e72e50dd41aaf9f 100644 (file)
@@ -1219,7 +1219,10 @@ bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
         return false;
     } else {
       // 'static inline' functions are used in headers; don't warn.
-      if (FD->getStorageClass() == SC_Static &&
+      // Make sure we get the storage class from the canonical declaration,
+      // since otherwise we will get spurious warnings on specialized
+      // static template functions.
+      if (FD->getCanonicalDecl()->getStorageClass() == SC_Static &&
           FD->isInlineSpecified())
         return false;
     }
index e12668bf2a466739420a8bc6611c0c8de5e4e7d9..9fb601130d3b5e1da949dbbc56f1cdbb8032a675 100644 (file)
@@ -133,6 +133,27 @@ namespace test6 {
   };
 }
 
+namespace test7
+{
+  template<typename T>
+  static inline void foo(T) { }
+
+  // This should not emit an unused-function warning since it inherits
+  // the static storage type from the base template.
+  template<>
+  inline void foo(int) {  }
+
+  // Partial specialization
+  template<typename T, typename U>
+  static inline void bar(T, U) { }
+
+  template<typename U>
+  inline void bar(int, U) { }
+
+  template<>
+  inline void bar(int, int) { }
+};
+
 namespace pr14776 {
   namespace {
     struct X {};