1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -Wno-c++11-extensions -std=c++98 %s 2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -std=c++11 %s 3*67e74705SXin Li 4*67e74705SXin Li #ifdef HEADER 5*67e74705SXin Li headerstatic()6*67e74705SXin Listatic void headerstatic() {} // expected-warning{{unused}} headerstaticinline()7*67e74705SXin Listatic inline void headerstaticinline() {} 8*67e74705SXin Li 9*67e74705SXin Li namespace { headeranon()10*67e74705SXin Li void headeranon() {} // expected-warning{{unused}} headerinlineanon()11*67e74705SXin Li inline void headerinlineanon() {} 12*67e74705SXin Li } 13*67e74705SXin Li 14*67e74705SXin Li namespace test7 15*67e74705SXin Li { 16*67e74705SXin Li template<typename T> foo(T)17*67e74705SXin Li static inline void foo(T) { } 18*67e74705SXin Li 19*67e74705SXin Li // This should not emit an unused-function warning since it inherits 20*67e74705SXin Li // the static storage type from the base template. 21*67e74705SXin Li template<> foo(int)22*67e74705SXin Li inline void foo(int) { } 23*67e74705SXin Li 24*67e74705SXin Li // Partial specialization 25*67e74705SXin Li template<typename T, typename U> bar(T,U)26*67e74705SXin Li static inline void bar(T, U) { } 27*67e74705SXin Li 28*67e74705SXin Li template<typename U> bar(int,U)29*67e74705SXin Li inline void bar(int, U) { } 30*67e74705SXin Li 31*67e74705SXin Li template<> bar(int,int)32*67e74705SXin Li inline void bar(int, int) { } 33*67e74705SXin Li }; 34*67e74705SXin Li 35*67e74705SXin Li namespace pr19713 { 36*67e74705SXin Li #if __cplusplus >= 201103L constexpr1()37*67e74705SXin Li static constexpr int constexpr1() { return 1; } constexpr2()38*67e74705SXin Li constexpr int constexpr2() { return 2; } 39*67e74705SXin Li #endif 40*67e74705SXin Li } 41*67e74705SXin Li 42*67e74705SXin Li #else 43*67e74705SXin Li #define HEADER 44*67e74705SXin Li #include "warn-unused-filescoped.cpp" 45*67e74705SXin Li 46*67e74705SXin Li static void f1(); // expected-warning{{unused}} 47*67e74705SXin Li 48*67e74705SXin Li namespace { 49*67e74705SXin Li void f2(); // expected-warning{{unused}} 50*67e74705SXin Li f3()51*67e74705SXin Li void f3() { } // expected-warning{{unused}} 52*67e74705SXin Li 53*67e74705SXin Li struct S { m1__anon854cb8c70211::S54*67e74705SXin Li void m1() { } // expected-warning{{unused}} 55*67e74705SXin Li void m2(); // expected-warning{{unused}} 56*67e74705SXin Li void m3(); 57*67e74705SXin Li S(const S&); 58*67e74705SXin Li void operator=(const S&); 59*67e74705SXin Li }; 60*67e74705SXin Li 61*67e74705SXin Li template <typename T> 62*67e74705SXin Li struct TS { 63*67e74705SXin Li void m(); 64*67e74705SXin Li }; m()65*67e74705SXin Li template <> void TS<int>::m() { } // expected-warning{{unused}} 66*67e74705SXin Li 67*67e74705SXin Li template <typename T> tf()68*67e74705SXin Li void tf() { } tf()69*67e74705SXin Li template <> void tf<int>() { } // expected-warning{{unused}} 70*67e74705SXin Li 71*67e74705SXin Li struct VS { vm__anon854cb8c70211::VS72*67e74705SXin Li virtual void vm() { } 73*67e74705SXin Li }; 74*67e74705SXin Li 75*67e74705SXin Li struct SVS : public VS { vm__anon854cb8c70211::SVS76*67e74705SXin Li void vm() { } 77*67e74705SXin Li }; 78*67e74705SXin Li } 79*67e74705SXin Li m3()80*67e74705SXin Livoid S::m3() { } // expected-warning{{unused}} 81*67e74705SXin Li f4()82*67e74705SXin Listatic inline void f4() { } // expected-warning{{unused}} 83*67e74705SXin Li const unsigned int cx = 0; // expected-warning{{unused}} 84*67e74705SXin Li const unsigned int cy = 0; f5()85*67e74705SXin Liint f5() { return cy; } 86*67e74705SXin Li 87*67e74705SXin Li static int x1; // expected-warning{{unused}} 88*67e74705SXin Li 89*67e74705SXin Li namespace { 90*67e74705SXin Li int x2; // expected-warning{{unused}} 91*67e74705SXin Li 92*67e74705SXin Li struct S2 { 93*67e74705SXin Li static int x; // expected-warning{{unused}} 94*67e74705SXin Li }; 95*67e74705SXin Li 96*67e74705SXin Li template <typename T> 97*67e74705SXin Li struct TS2 { 98*67e74705SXin Li static int x; 99*67e74705SXin Li }; 100*67e74705SXin Li template <> int TS2<int>::x; // expected-warning{{unused}} 101*67e74705SXin Li } 102*67e74705SXin Li 103*67e74705SXin Li namespace PR8841 { 104*67e74705SXin Li // Ensure that friends of class templates are considered to have a dependent 105*67e74705SXin Li // context and not marked unused. 106*67e74705SXin Li namespace { 107*67e74705SXin Li template <typename T> struct X { operator ==(const X &,const X &)108*67e74705SXin Li friend bool operator==(const X&, const X&) { return false; } 109*67e74705SXin Li }; 110*67e74705SXin Li } template_test(X<T> x)111*67e74705SXin Li template <typename T> void template_test(X<T> x) { 112*67e74705SXin Li (void)(x == x); 113*67e74705SXin Li } test()114*67e74705SXin Li void test() { 115*67e74705SXin Li X<int> x; 116*67e74705SXin Li template_test(x); 117*67e74705SXin Li } 118*67e74705SXin Li } 119*67e74705SXin Li 120*67e74705SXin Li namespace test4 { 121*67e74705SXin Li namespace { struct A {}; } 122*67e74705SXin Li 123*67e74705SXin Li void test(A a); // expected-warning {{unused function}} 124*67e74705SXin Li extern "C" void test4(A a); 125*67e74705SXin Li } 126*67e74705SXin Li 127*67e74705SXin Li namespace rdar8733476 { foo()128*67e74705SXin Li static void foo() { } // expected-warning {{not needed and will not be emitted}} 129*67e74705SXin Li 130*67e74705SXin Li template <int> bar()131*67e74705SXin Li void bar() { 132*67e74705SXin Li foo(); 133*67e74705SXin Li } 134*67e74705SXin Li } 135*67e74705SXin Li 136*67e74705SXin Li namespace test5 { 137*67e74705SXin Li static int n = 0; 138*67e74705SXin Li static int &r = n; 139*67e74705SXin Li int f(int &); 140*67e74705SXin Li int k = f(r); 141*67e74705SXin Li 142*67e74705SXin Li // FIXME: We should produce warnings for both of these. 143*67e74705SXin Li static const int m = n; 144*67e74705SXin Li int x = sizeof(m); 145*67e74705SXin Li static const double d = 0.0; // expected-warning{{not needed and will not be emitted}} 146*67e74705SXin Li int y = sizeof(d); 147*67e74705SXin Li } 148*67e74705SXin Li 149*67e74705SXin Li namespace unused_nested { 150*67e74705SXin Li class outer { 151*67e74705SXin Li void func1(); 152*67e74705SXin Li struct { func2unused_nested::outer::__anon854cb8c70608153*67e74705SXin Li void func2() { 154*67e74705SXin Li } 155*67e74705SXin Li } x; 156*67e74705SXin Li }; 157*67e74705SXin Li } 158*67e74705SXin Li 159*67e74705SXin Li namespace unused { 160*67e74705SXin Li struct { funcunused::__anon854cb8c70708161*67e74705SXin Li void func() { // expected-warning {{unused member function}} 162*67e74705SXin Li } 163*67e74705SXin Li } x; // expected-warning {{unused variable}} 164*67e74705SXin Li } 165*67e74705SXin Li 166*67e74705SXin Li namespace test6 { 167*67e74705SXin Li typedef struct { 168*67e74705SXin Li void bar(); 169*67e74705SXin Li } A; 170*67e74705SXin Li 171*67e74705SXin Li typedef struct { 172*67e74705SXin Li void bar(); // expected-warning {{unused member function 'bar'}} 173*67e74705SXin Li } *B; 174*67e74705SXin Li 175*67e74705SXin Li struct C { 176*67e74705SXin Li void bar(); 177*67e74705SXin Li }; 178*67e74705SXin Li } 179*67e74705SXin Li 180*67e74705SXin Li namespace pr14776 { 181*67e74705SXin Li namespace { 182*67e74705SXin Li struct X {}; 183*67e74705SXin Li } 184*67e74705SXin Li X a = X(); // expected-warning {{unused variable 'a'}} 185*67e74705SXin Li auto b = X(); // expected-warning {{unused variable 'b'}} 186*67e74705SXin Li } 187*67e74705SXin Li 188*67e74705SXin Li namespace UndefinedInternalStaticMember { 189*67e74705SXin Li namespace { 190*67e74705SXin Li struct X { 191*67e74705SXin Li static const unsigned x = 3; 192*67e74705SXin Li int y[x]; 193*67e74705SXin Li }; 194*67e74705SXin Li } 195*67e74705SXin Li } 196*67e74705SXin Li 197*67e74705SXin Li namespace test8 { 198*67e74705SXin Li static void func(); bar()199*67e74705SXin Livoid bar() { void func() __attribute__((used)); } func()200*67e74705SXin Listatic void func() {} 201*67e74705SXin Li } 202*67e74705SXin Li 203*67e74705SXin Li namespace pr19713 { 204*67e74705SXin Li #if __cplusplus >= 201103L 205*67e74705SXin Li // FIXME: We should warn on both of these. constexpr3()206*67e74705SXin Li static constexpr int constexpr3() { return 1; } // expected-warning {{unused}} constexpr4()207*67e74705SXin Li constexpr int constexpr4() { return 2; } 208*67e74705SXin Li #endif 209*67e74705SXin Li } 210*67e74705SXin Li 211*67e74705SXin Li #endif 212