153 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify %s
 | |
| template<typename T> void f() {
 | |
|   T t;
 | |
|   t = 17;
 | |
| }
 | |
| 
 | |
| // PR5407
 | |
| struct A { A(); };
 | |
| struct B { ~B(); };
 | |
| void f() {
 | |
|   A a;
 | |
|   B b;
 | |
| }
 | |
| 
 | |
| // PR5531
 | |
| namespace PR5531 {
 | |
|   struct A {
 | |
|   };
 | |
| 
 | |
|   struct B {
 | |
|     B(int);
 | |
|   };
 | |
| 
 | |
|   struct C {
 | |
|     ~C();
 | |
|   };
 | |
| 
 | |
|   void test() {
 | |
|     A();
 | |
|     B(17);
 | |
|     C();
 | |
|   }
 | |
| }
 | |
| 
 | |
| template<typename T>
 | |
| struct X0 { };
 | |
| 
 | |
| template<typename T>
 | |
| void test_dependent_init(T *p) {
 | |
|   X0<int> i(p);
 | |
|   (void)i;
 | |
| }
 | |
| 
 | |
| void unused_local_static() {
 | |
|   static int x = 0;
 | |
|   static int y = 0; // expected-warning{{unused variable 'y'}}
 | |
| #pragma unused(x)
 | |
| }
 | |
| 
 | |
| // PR10168
 | |
| namespace PR10168 {
 | |
|   // We expect a warning in the definition only for non-dependent variables, and
 | |
|   // a warning in the instantiation only for dependent variables.
 | |
|   template<typename T>
 | |
|   struct S {
 | |
|     void f() {
 | |
|       int a; // expected-warning {{unused variable 'a'}}
 | |
|       T b; // expected-warning 2{{unused variable 'b'}}
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   template<typename T>
 | |
|   void f() {
 | |
|     int a; // expected-warning {{unused variable 'a'}}
 | |
|     T b; // expected-warning 2{{unused variable 'b'}}
 | |
|   }
 | |
| 
 | |
|   void g() {
 | |
|     S<int>().f(); // expected-note {{here}}
 | |
|     S<char>().f(); // expected-note {{here}}
 | |
|     f<int>(); // expected-note {{here}}
 | |
|     f<char>(); // expected-note {{here}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace PR11550 {
 | |
|   struct S1 {
 | |
|     S1();
 | |
|   };
 | |
|   S1 makeS1();
 | |
|   void testS1(S1 a) {
 | |
|     // This constructor call can be elided.
 | |
|     S1 x = makeS1(); // expected-warning {{unused variable 'x'}}
 | |
| 
 | |
|     // This one cannot, so no warning.
 | |
|     S1 y;
 | |
| 
 | |
|     // This call cannot, but the constructor is trivial.
 | |
|     S1 z = a; // expected-warning {{unused variable 'z'}}
 | |
|   }
 | |
| 
 | |
|   // The same is true even when we know thet constructor has side effects.
 | |
|   void foo();
 | |
|   struct S2 {
 | |
|     S2() {
 | |
|       foo();
 | |
|     }
 | |
|   };
 | |
|   S2 makeS2();
 | |
|   void testS2(S2 a) {
 | |
|     S2 x = makeS2(); // expected-warning {{unused variable 'x'}}
 | |
|     S2 y;
 | |
|     S2 z = a; // expected-warning {{unused variable 'z'}}
 | |
|   }
 | |
| 
 | |
|   // Or when the constructor is not declared by the user.
 | |
|   struct S3 {
 | |
|     S1 m;
 | |
|   };
 | |
|   S3 makeS3();
 | |
|   void testS3(S3 a) {
 | |
|     S3 x = makeS3(); // expected-warning {{unused variable 'x'}}
 | |
|     S3 y;
 | |
|     S3 z = a; // expected-warning {{unused variable 'z'}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace PR19305 {
 | |
|   template<typename T> int n = 0; // no warning
 | |
|   int a = n<int>;
 | |
| 
 | |
|   template<typename T> const int l = 0; // no warning
 | |
|   int b = l<int>;
 | |
| 
 | |
|   // PR19558
 | |
|   template<typename T> const int o = 0; // no warning
 | |
|   template<typename T> const int o<T*> = 0; // no warning
 | |
|   int c = o<int*>;
 | |
| 
 | |
|   template<> int o<void> = 0; // no warning
 | |
|   int d = o<void>;
 | |
| 
 | |
|   // FIXME: It'd be nice to warn here.
 | |
|   template<typename T> int m = 0;
 | |
|   template<typename T> int m<T*> = 0;
 | |
| 
 | |
|   template<> const int m<void> = 0; // expected-warning {{unused variable}}
 | |
| }
 | |
| 
 | |
| namespace ctor_with_cleanups {
 | |
|   struct S1 {
 | |
|     ~S1();
 | |
|   };
 | |
|   struct S2 {
 | |
|     S2(const S1&);
 | |
|   };
 | |
|   void func() {
 | |
|     S2 s((S1()));
 | |
|   }
 | |
| }
 | |
| 
 | |
| #include "Inputs/warn-unused-variables.h"
 |