16769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-c++11-extensions -std=c++98 %s
2623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -std=c++11 %s
3bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
4bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic void f1(); // expected-warning{{unused}}
5bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
6bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace {
7bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void f2();  // expected-warning{{unused}}
8bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
9bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void f3() { }  // expected-warning{{unused}}
10bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
11bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct S {
12bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m1() { }  // expected-warning{{unused}}
13bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m2();  // expected-warning{{unused}}
14bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m3();
1506999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis    S(const S&);
1606999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis    void operator=(const S&);
17bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
18bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
19bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
20bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct TS {
21bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m();
22bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
23bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> void TS<int>::m() { }  // expected-warning{{unused}}
24bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
25bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
26bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void tf() { }
27bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> void tf<int>() { }  // expected-warning{{unused}}
28bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
29bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct VS {
30bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    virtual void vm() { }
31bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
32bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
33bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct SVS : public VS {
34bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void vm() { }
35bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
36bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
37bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
38bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisvoid S::m3() { }  // expected-warning{{unused}}
39bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
40bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic inline void f4() { }
41bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisconst unsigned int cx = 0;
42bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
43bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic int x1;  // expected-warning{{unused}}
44bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
45bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace {
46bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  int x2;  // expected-warning{{unused}}
47bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
48bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct S2 {
49bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    static int x;  // expected-warning{{unused}}
50bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
51bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
52bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
53bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct TS2 {
54bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    static int x;
55bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
56bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> int TS2<int>::x;  // expected-warning{{unused}}
57bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
58ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth
59ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruthnamespace PR8841 {
60ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  // Ensure that friends of class templates are considered to have a dependent
61ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  // context and not marked unused.
62ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  namespace {
63ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    template <typename T> struct X {
64ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth      friend bool operator==(const X&, const X&) { return false; }
65ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    };
66ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
67ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  template <typename T> void template_test(X<T> x) {
68ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    (void)(x == x);
69ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
70af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  void test() {
71af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall    X<int> x;
72ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    template_test(x);
73ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
74ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth}
75af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall
76af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCallnamespace test4 {
77af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  namespace { struct A {}; }
78af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall
79af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  void test(A a); // expected-warning {{unused function}}
80af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  extern "C" void test4(A a);
81af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall}
826b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis
836b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidisnamespace rdar8733476 {
846b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  static void foo() { } // expected-warning {{not needed and will not be emitted}}
856b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis
866b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  template <int>
876b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  void bar() {
886b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis    foo();
896b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  }
906b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis}
91623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith
92623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smithnamespace test5 {
93623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  static int n = 0;
94623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  static int &r = n;
95623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int f(int &);
96623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int k = f(r);
97623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith
98c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith  // FIXME: We should produce warnings for both of these.
99c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith  static const int m = n;
100623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int x = sizeof(m);
101c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith  static const double d = 0.0;
102623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int y = sizeof(d);
103623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith}
10466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
10566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace unused_nested {
10666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  class outer {
10766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    void func1();
10866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    struct {
10966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      void func2() {
11066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      }
11166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    } x;
11266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  };
11366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
11466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
11566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace unused {
11666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  struct {
11766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    void func() { // expected-warning {{unused member function}}
11866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    }
11966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  } x; // expected-warning {{unused variable}}
12066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
12187b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola
12287b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindolanamespace test6 {
12387b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  typedef struct {
12487b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola    void bar();
12587b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  } A;
12687b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola
12787b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  typedef struct {
12887b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola    void bar();  // expected-warning {{unused member function 'bar'}}
12987b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  } *B;
13087b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola
13187b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  struct C {
13287b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola    void bar();
13387b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  };
13487b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola}
1356769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola
1366769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindolanamespace pr14776 {
1376769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  namespace {
1386769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola    struct X {};
1396769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  }
1406769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  X a = X(); // expected-warning {{unused variable 'a'}}
1416769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  auto b = X(); // expected-warning {{unused variable 'b'}}
1426769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola}
143