142cbd782cf17223076e5b6c0607414d9d68aae19Argyrios Kyrtzidis// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function %s
2bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
3bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic void f1(); // expected-warning{{unused}}
4bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
5bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace {
6bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void f2();  // expected-warning{{unused}}
7bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
8bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void f3() { }  // expected-warning{{unused}}
9bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
10bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct S {
11bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m1() { }  // expected-warning{{unused}}
12bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m2();  // expected-warning{{unused}}
13bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m3();
1406999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis    S(const S&);
1506999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis    void operator=(const S&);
16bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
17bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
18bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
19bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct TS {
20bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m();
21bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
22bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> void TS<int>::m() { }  // expected-warning{{unused}}
23bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
24bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
25bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void tf() { }
26bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> void tf<int>() { }  // expected-warning{{unused}}
27bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
28bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct VS {
29bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    virtual void vm() { }
30bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
31bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
32bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct SVS : public VS {
33bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void vm() { }
34bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
35bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
36bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
37bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisvoid S::m3() { }  // expected-warning{{unused}}
38bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
39bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic inline void f4() { }
40bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisconst unsigned int cx = 0;
41bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
42bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic int x1;  // expected-warning{{unused}}
43bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
44bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace {
45bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  int x2;  // expected-warning{{unused}}
46bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
47bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct S2 {
48bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    static int x;  // expected-warning{{unused}}
49bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
50bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
51bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
52bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct TS2 {
53bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    static int x;
54bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
55bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> int TS2<int>::x;  // expected-warning{{unused}}
56bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
57ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth
58ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruthnamespace PR8841 {
59ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  // Ensure that friends of class templates are considered to have a dependent
60ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  // context and not marked unused.
61ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  namespace {
62ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    template <typename T> struct X {
63ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth      friend bool operator==(const X&, const X&) { return false; }
64ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    };
65ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
66ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  template <typename T> void template_test(X<T> x) {
67ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    (void)(x == x);
68ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
69af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  void test() {
70af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall    X<int> x;
71ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    template_test(x);
72ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
73ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth}
74af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall
75af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCallnamespace test4 {
76af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  namespace { struct A {}; }
77af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall
78af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  void test(A a); // expected-warning {{unused function}}
79af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  extern "C" void test4(A a);
80af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall}
816b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis
826b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidisnamespace rdar8733476 {
836b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  static void foo() { } // expected-warning {{not needed and will not be emitted}}
846b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis
856b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  template <int>
866b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  void bar() {
876b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis    foo();
886b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  }
896b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis}
90