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