warn-unused-variables.cpp revision 1a5d35539a16f3b2eb2426f3f23a8376b190741c
1// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -verify %s
2template<typename T> void f() {
3  T t;
4  t = 17;
5}
6
7// PR5407
8struct A { A(); };
9struct B { ~B(); };
10void f() {
11  A a;
12  B b;
13}
14
15// PR5531
16namespace PR5531 {
17  struct A {
18  };
19
20  struct B {
21    B(int);
22  };
23
24  struct C {
25    ~C();
26  };
27
28  void test() {
29    A();
30    B(17);
31    C();
32  }
33}
34
35template<typename T>
36struct X0 { };
37
38template<typename T>
39void test_dependent_init(T *p) {
40  X0<int> i(p);
41  (void)i;
42}
43
44namespace PR6948 {
45  template<typename T> class X;
46
47  void f() {
48    X<char> str (read_from_file()); // expected-error{{use of undeclared identifier 'read_from_file'}}
49  }
50}
51
52void unused_local_static() {
53  static int x = 0;
54  static int y = 0; // expected-warning{{unused variable 'y'}}
55#pragma unused(x)
56}
57
58// PR10168
59namespace PR10168 {
60  // We expect a warning in the definition only for non-dependent variables, and
61  // a warning in the instantiation only for dependent variables.
62  template<typename T>
63  struct S {
64    void f() {
65      int a; // expected-warning {{unused variable 'a'}}
66      T b; // expected-warning 2{{unused variable 'b'}}
67    }
68  };
69
70  template<typename T>
71  void f() {
72    int a; // expected-warning {{unused variable 'a'}}
73    T b; // expected-warning 2{{unused variable 'b'}}
74  }
75
76  void g() {
77    S<int>().f(); // expected-note {{here}}
78    S<char>().f(); // expected-note {{here}}
79    f<int>(); // expected-note {{here}}
80    f<char>(); // expected-note {{here}}
81  }
82}
83
84namespace PR11550 {
85  struct S1 {
86    S1();
87  };
88  S1 makeS1();
89  void testS1(S1 a) {
90    // This constructor call can be elided.
91    S1 x = makeS1(); // expected-warning {{unused variable 'x'}}
92
93    // This one cannot, so no warning.
94    S1 y;
95
96    // This call cannot, but the constructor is trivial.
97    S1 z = a; // expected-warning {{unused variable 'z'}}
98  }
99
100  // The same is true even when we know thet constructor has side effects.
101  void foo();
102  struct S2 {
103    S2() {
104      foo();
105    }
106  };
107  S2 makeS2();
108  void testS2(S2 a) {
109    S2 x = makeS2(); // expected-warning {{unused variable 'x'}}
110    S2 y;
111    S2 z = a; // expected-warning {{unused variable 'z'}}
112  }
113
114  // Or when the constructor is not declared by the user.
115  struct S3 {
116    S1 m;
117  };
118  S3 makeS3();
119  void testS3(S3 a) {
120    S3 x = makeS3(); // expected-warning {{unused variable 'x'}}
121    S3 y;
122    S3 z = a; // expected-warning {{unused variable 'z'}}
123  }
124}
125