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!

llvm-svn: 179598

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

index a17e9d0..c20b5ff 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 e12668b..9fb6011 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 {};