1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -Wno-c++11-extensions -std=c++98 %s
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -std=c++11 %s
3bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
439bd371610af27b073c792c54c6c28133329f6adEli Friedman#ifdef HEADER
539bd371610af27b073c792c54c6c28133329f6adEli Friedman
639bd371610af27b073c792c54c6c28133329f6adEli Friedmanstatic void headerstatic() {}  // expected-warning{{unused}}
739bd371610af27b073c792c54c6c28133329f6adEli Friedmanstatic inline void headerstaticinline() {}
839bd371610af27b073c792c54c6c28133329f6adEli Friedman
939bd371610af27b073c792c54c6c28133329f6adEli Friedmannamespace {
1039bd371610af27b073c792c54c6c28133329f6adEli Friedman  void headeranon() {}  // expected-warning{{unused}}
1139bd371610af27b073c792c54c6c28133329f6adEli Friedman  inline void headerinlineanon() {}
1239bd371610af27b073c792c54c6c28133329f6adEli Friedman}
1339bd371610af27b073c792c54c6c28133329f6adEli Friedman
1439bd371610af27b073c792c54c6c28133329f6adEli Friedmannamespace test7
1539bd371610af27b073c792c54c6c28133329f6adEli Friedman{
1639bd371610af27b073c792c54c6c28133329f6adEli Friedman  template<typename T>
1739bd371610af27b073c792c54c6c28133329f6adEli Friedman  static inline void foo(T) { }
1839bd371610af27b073c792c54c6c28133329f6adEli Friedman
1939bd371610af27b073c792c54c6c28133329f6adEli Friedman  // This should not emit an unused-function warning since it inherits
2039bd371610af27b073c792c54c6c28133329f6adEli Friedman  // the static storage type from the base template.
2139bd371610af27b073c792c54c6c28133329f6adEli Friedman  template<>
2239bd371610af27b073c792c54c6c28133329f6adEli Friedman  inline void foo(int) {  }
2339bd371610af27b073c792c54c6c28133329f6adEli Friedman
2439bd371610af27b073c792c54c6c28133329f6adEli Friedman  // Partial specialization
2539bd371610af27b073c792c54c6c28133329f6adEli Friedman  template<typename T, typename U>
2639bd371610af27b073c792c54c6c28133329f6adEli Friedman  static inline void bar(T, U) { }
2739bd371610af27b073c792c54c6c28133329f6adEli Friedman
2839bd371610af27b073c792c54c6c28133329f6adEli Friedman  template<typename U>
2939bd371610af27b073c792c54c6c28133329f6adEli Friedman  inline void bar(int, U) { }
3039bd371610af27b073c792c54c6c28133329f6adEli Friedman
3139bd371610af27b073c792c54c6c28133329f6adEli Friedman  template<>
3239bd371610af27b073c792c54c6c28133329f6adEli Friedman  inline void bar(int, int) { }
3339bd371610af27b073c792c54c6c28133329f6adEli Friedman};
3439bd371610af27b073c792c54c6c28133329f6adEli Friedman
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace pr19713 {
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus >= 201103L
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static constexpr int constexpr1() { return 1; }
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  constexpr int constexpr2() { return 2; }
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4239bd371610af27b073c792c54c6c28133329f6adEli Friedman#else
4339bd371610af27b073c792c54c6c28133329f6adEli Friedman#define HEADER
4439bd371610af27b073c792c54c6c28133329f6adEli Friedman#include "warn-unused-filescoped.cpp"
4539bd371610af27b073c792c54c6c28133329f6adEli Friedman
46bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic void f1(); // expected-warning{{unused}}
47bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
48bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace {
49bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void f2();  // expected-warning{{unused}}
50bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
51bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void f3() { }  // expected-warning{{unused}}
52bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
53bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct S {
54bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m1() { }  // expected-warning{{unused}}
55bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m2();  // expected-warning{{unused}}
56bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m3();
5706999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis    S(const S&);
5806999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis    void operator=(const S&);
59bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
60bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
61bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
62bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct TS {
63bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void m();
64bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
65bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> void TS<int>::m() { }  // expected-warning{{unused}}
66bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
67bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
68bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  void tf() { }
69bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> void tf<int>() { }  // expected-warning{{unused}}
70bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
71bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct VS {
72bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    virtual void vm() { }
73bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
74bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
75bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct SVS : public VS {
76bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    void vm() { }
77bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
78bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
79bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
80bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisvoid S::m3() { }  // expected-warning{{unused}}
81bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
8239bd371610af27b073c792c54c6c28133329f6adEli Friedmanstatic inline void f4() { }  // expected-warning{{unused}}
8339bd371610af27b073c792c54c6c28133329f6adEli Friedmanconst unsigned int cx = 0; // expected-warning{{unused}}
8439bd371610af27b073c792c54c6c28133329f6adEli Friedmanconst unsigned int cy = 0;
8539bd371610af27b073c792c54c6c28133329f6adEli Friedmanint f5() { return cy; }
86bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
87bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic int x1;  // expected-warning{{unused}}
88bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
89bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace {
90bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  int x2;  // expected-warning{{unused}}
91bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
92bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct S2 {
93bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    static int x;  // expected-warning{{unused}}
94bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
95bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis
96bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <typename T>
97bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  struct TS2 {
98bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis    static int x;
99bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  };
100bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis  template <> int TS2<int>::x;  // expected-warning{{unused}}
101bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis}
102ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth
103ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruthnamespace PR8841 {
104ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  // Ensure that friends of class templates are considered to have a dependent
105ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  // context and not marked unused.
106ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  namespace {
107ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    template <typename T> struct X {
108ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth      friend bool operator==(const X&, const X&) { return false; }
109ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    };
110ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
111ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  template <typename T> void template_test(X<T> x) {
112ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    (void)(x == x);
113ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
114af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  void test() {
115af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall    X<int> x;
116ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth    template_test(x);
117ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth  }
118ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth}
119af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall
120af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCallnamespace test4 {
121af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  namespace { struct A {}; }
122af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall
123af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  void test(A a); // expected-warning {{unused function}}
124af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall  extern "C" void test4(A a);
125af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall}
1266b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis
1276b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidisnamespace rdar8733476 {
1286b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  static void foo() { } // expected-warning {{not needed and will not be emitted}}
1296b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis
1306b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  template <int>
1316b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  void bar() {
1326b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis    foo();
1336b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis  }
1346b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis}
135623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith
136623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smithnamespace test5 {
137623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  static int n = 0;
138623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  static int &r = n;
139623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int f(int &);
140623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int k = f(r);
141623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith
142c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith  // FIXME: We should produce warnings for both of these.
143c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith  static const int m = n;
144623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int x = sizeof(m);
14539bd371610af27b073c792c54c6c28133329f6adEli Friedman  static const double d = 0.0; // expected-warning{{not needed and will not be emitted}}
146623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith  int y = sizeof(d);
147623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith}
14866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
14966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace unused_nested {
15066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  class outer {
15166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    void func1();
15266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    struct {
15366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      void func2() {
15466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie      }
15566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    } x;
15666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  };
15766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
15866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie
15966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace unused {
16066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  struct {
16166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    void func() { // expected-warning {{unused member function}}
16266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie    }
16366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie  } x; // expected-warning {{unused variable}}
16466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
16587b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola
16687b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindolanamespace test6 {
16787b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  typedef struct {
16887b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola    void bar();
16987b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  } A;
17087b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola
17187b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  typedef struct {
17287b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola    void bar();  // expected-warning {{unused member function 'bar'}}
17387b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  } *B;
17487b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola
17587b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  struct C {
17687b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola    void bar();
17787b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola  };
17887b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola}
1796769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola
1806769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindolanamespace pr14776 {
1816769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  namespace {
1826769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola    struct X {};
1836769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  }
1846769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  X a = X(); // expected-warning {{unused variable 'a'}}
1856769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola  auto b = X(); // expected-warning {{unused variable 'b'}}
1866769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola}
18739bd371610af27b073c792c54c6c28133329f6adEli Friedman
1881507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedmannamespace UndefinedInternalStaticMember {
1891507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman  namespace {
1901507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman    struct X {
1911507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman      static const unsigned x = 3;
1921507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman      int y[x];
1931507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman    };
1941507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman  }
1951507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman}
1961507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman
197101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolanamespace test8 {
198101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolastatic void func();
199101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolavoid bar() { void func() __attribute__((used)); }
200101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolastatic void func() {}
201101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindola}
202101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindola
2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace pr19713 {
2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus >= 201103L
2056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: We should warn on both of these.
2066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static constexpr int constexpr3() { return 1; } // expected-warning {{unused}}
2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  constexpr int constexpr4() { return 2; }
2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
21139bd371610af27b073c792c54c6c28133329f6adEli Friedman#endif
212