warn-unused-filescoped.cpp revision 39bd371610af27b073c792c54c6c28133329f6ad
1// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-c++11-extensions -std=c++98 %s 2// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -std=c++11 %s 3 4#ifdef HEADER 5 6static void headerstatic() {} // expected-warning{{unused}} 7static inline void headerstaticinline() {} 8 9namespace { 10 void headeranon() {} // expected-warning{{unused}} 11 inline void headerinlineanon() {} 12} 13 14namespace 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#else 36#define HEADER 37#include "warn-unused-filescoped.cpp" 38 39static void f1(); // expected-warning{{unused}} 40 41namespace { 42 void f2(); // expected-warning{{unused}} 43 44 void f3() { } // expected-warning{{unused}} 45 46 struct S { 47 void m1() { } // expected-warning{{unused}} 48 void m2(); // expected-warning{{unused}} 49 void m3(); 50 S(const S&); 51 void operator=(const S&); 52 }; 53 54 template <typename T> 55 struct TS { 56 void m(); 57 }; 58 template <> void TS<int>::m() { } // expected-warning{{unused}} 59 60 template <typename T> 61 void tf() { } 62 template <> void tf<int>() { } // expected-warning{{unused}} 63 64 struct VS { 65 virtual void vm() { } 66 }; 67 68 struct SVS : public VS { 69 void vm() { } 70 }; 71} 72 73void S::m3() { } // expected-warning{{unused}} 74 75static inline void f4() { } // expected-warning{{unused}} 76const unsigned int cx = 0; // expected-warning{{unused}} 77const unsigned int cy = 0; 78int f5() { return cy; } 79 80static int x1; // expected-warning{{unused}} 81 82namespace { 83 int x2; // expected-warning{{unused}} 84 85 struct S2 { 86 static int x; // expected-warning{{unused}} 87 }; 88 89 template <typename T> 90 struct TS2 { 91 static int x; 92 }; 93 template <> int TS2<int>::x; // expected-warning{{unused}} 94} 95 96namespace PR8841 { 97 // Ensure that friends of class templates are considered to have a dependent 98 // context and not marked unused. 99 namespace { 100 template <typename T> struct X { 101 friend bool operator==(const X&, const X&) { return false; } 102 }; 103 } 104 template <typename T> void template_test(X<T> x) { 105 (void)(x == x); 106 } 107 void test() { 108 X<int> x; 109 template_test(x); 110 } 111} 112 113namespace test4 { 114 namespace { struct A {}; } 115 116 void test(A a); // expected-warning {{unused function}} 117 extern "C" void test4(A a); 118} 119 120namespace rdar8733476 { 121 static void foo() { } // expected-warning {{not needed and will not be emitted}} 122 123 template <int> 124 void bar() { 125 foo(); 126 } 127} 128 129namespace test5 { 130 static int n = 0; 131 static int &r = n; 132 int f(int &); 133 int k = f(r); 134 135 // FIXME: We should produce warnings for both of these. 136 static const int m = n; 137 int x = sizeof(m); 138 static const double d = 0.0; // expected-warning{{not needed and will not be emitted}} 139 int y = sizeof(d); 140} 141 142namespace unused_nested { 143 class outer { 144 void func1(); 145 struct { 146 void func2() { 147 } 148 } x; 149 }; 150} 151 152namespace unused { 153 struct { 154 void func() { // expected-warning {{unused member function}} 155 } 156 } x; // expected-warning {{unused variable}} 157} 158 159namespace test6 { 160 typedef struct { 161 void bar(); 162 } A; 163 164 typedef struct { 165 void bar(); // expected-warning {{unused member function 'bar'}} 166 } *B; 167 168 struct C { 169 void bar(); 170 }; 171} 172 173namespace pr14776 { 174 namespace { 175 struct X {}; 176 } 177 X a = X(); // expected-warning {{unused variable 'a'}} 178 auto b = X(); // expected-warning {{unused variable 'b'}} 179} 180 181#endif 182