]> granicus.if.org Git - clang/commitdiff
Fix PR8841 by checking for both semantic and lecical dependent
authorChandler Carruth <chandlerc@gmail.com>
Mon, 3 Jan 2011 19:27:19 +0000 (19:27 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 3 Jan 2011 19:27:19 +0000 (19:27 +0000)
contexts. This prevents -Wunused-function from firing on friend function
definitions inside of class templates for example.

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

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

index 32791f9f9838ffc905831ef4156093af5f999051..dc851a3e8365aa6bb26fa9595bf76a58406e6367 100644 (file)
@@ -557,7 +557,8 @@ bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const {
     return false;
 
   // Ignore class templates.
-  if (D->getDeclContext()->isDependentContext())
+  if (D->getDeclContext()->isDependentContext() ||
+      D->getLexicalDeclContext()->isDependentContext())
     return false;
 
   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
index 75fc6a4da0ba1da66cbbf7e600ac5e288bdfa309..628075ac04dded2de87da352b40f0a31f86ee8f7 100644 (file)
@@ -54,3 +54,19 @@ namespace {
   };
   template <> int TS2<int>::x;  // expected-warning{{unused}}
 }
+
+namespace PR8841 {
+  // Ensure that friends of class templates are considered to have a dependent
+  // context and not marked unused.
+  namespace {
+    template <typename T> struct X {
+      friend bool operator==(const X&, const X&) { return false; }
+    };
+  }
+  template <typename T> void template_test(X<T> x) {
+    (void)(x == x);
+  }
+  void test(X<int> x) {
+    template_test(x);
+  }
+}