xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-unused-filescoped.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li static void headerstatic() {}  // expected-warning{{unused}}
headerstaticinline()7*67e74705SXin Li static 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 Li void S::m3() { }  // expected-warning{{unused}}
81*67e74705SXin Li 
f4()82*67e74705SXin Li static 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 Li int 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 Li void bar() { void func() __attribute__((used)); }
func()200*67e74705SXin Li static 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