1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify %s
2b5352cf949898cd42c8c5bc96a17a831b61ac2e5Douglas Gregortemplate<typename T> void f() {
34dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregor  T t;
44dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregor  t = 17;
5b5352cf949898cd42c8c5bc96a17a831b61ac2e5Douglas Gregor}
6f7613d53619d11f46fb07ddb0ea90c9fb0cad027Anders Carlsson
76a8b7f3f62119f9d8659965ad36fa58059054c46Anders Carlsson// PR5407
8f7613d53619d11f46fb07ddb0ea90c9fb0cad027Anders Carlssonstruct A { A(); };
9f7613d53619d11f46fb07ddb0ea90c9fb0cad027Anders Carlssonstruct B { ~B(); };
10f7613d53619d11f46fb07ddb0ea90c9fb0cad027Anders Carlssonvoid f() {
11f7613d53619d11f46fb07ddb0ea90c9fb0cad027Anders Carlsson  A a;
12f7613d53619d11f46fb07ddb0ea90c9fb0cad027Anders Carlsson  B b;
136a8b7f3f62119f9d8659965ad36fa58059054c46Anders Carlsson}
1458beed91d468863b8c85bce43425422703838d27Anders Carlsson
1558beed91d468863b8c85bce43425422703838d27Anders Carlsson// PR5531
1658beed91d468863b8c85bce43425422703838d27Anders Carlssonnamespace PR5531 {
1758beed91d468863b8c85bce43425422703838d27Anders Carlsson  struct A {
1858beed91d468863b8c85bce43425422703838d27Anders Carlsson  };
1958beed91d468863b8c85bce43425422703838d27Anders Carlsson
2058beed91d468863b8c85bce43425422703838d27Anders Carlsson  struct B {
2158beed91d468863b8c85bce43425422703838d27Anders Carlsson    B(int);
2258beed91d468863b8c85bce43425422703838d27Anders Carlsson  };
2358beed91d468863b8c85bce43425422703838d27Anders Carlsson
2458beed91d468863b8c85bce43425422703838d27Anders Carlsson  struct C {
2558beed91d468863b8c85bce43425422703838d27Anders Carlsson    ~C();
2658beed91d468863b8c85bce43425422703838d27Anders Carlsson  };
2758beed91d468863b8c85bce43425422703838d27Anders Carlsson
2858beed91d468863b8c85bce43425422703838d27Anders Carlsson  void test() {
29ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    A();
3058beed91d468863b8c85bce43425422703838d27Anders Carlsson    B(17);
3158beed91d468863b8c85bce43425422703838d27Anders Carlsson    C();
3258beed91d468863b8c85bce43425422703838d27Anders Carlsson  }
3358beed91d468863b8c85bce43425422703838d27Anders Carlsson}
34cb1c77f90d4e747b83a0d0cc125dc01567378f82Nuno Lopes
354dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregortemplate<typename T>
364dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregorstruct X0 { };
374dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregor
384dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregortemplate<typename T>
394dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregorvoid test_dependent_init(T *p) {
404dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregor  X0<int> i(p);
414dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregor  (void)i;
424dffad64c5c7106dc5ac506be94944299c8f7bc3Douglas Gregor}
43a6a292b4dc47da42b2fc0662af7fe278c9e9fb33Douglas Gregor
44268f89e02de7bddbc9d7d7a147a3003bd81cf0d7Douglas Gregorvoid unused_local_static() {
45268f89e02de7bddbc9d7d7a147a3003bd81cf0d7Douglas Gregor  static int x = 0;
46268f89e02de7bddbc9d7d7a147a3003bd81cf0d7Douglas Gregor  static int y = 0; // expected-warning{{unused variable 'y'}}
47268f89e02de7bddbc9d7d7a147a3003bd81cf0d7Douglas Gregor#pragma unused(x)
48268f89e02de7bddbc9d7d7a147a3003bd81cf0d7Douglas Gregor}
49e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith
50e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith// PR10168
51e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smithnamespace PR10168 {
52e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  // We expect a warning in the definition only for non-dependent variables, and
53e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  // a warning in the instantiation only for dependent variables.
54e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  template<typename T>
55e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  struct S {
56e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    void f() {
57e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith      int a; // expected-warning {{unused variable 'a'}}
58e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith      T b; // expected-warning 2{{unused variable 'b'}}
59e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    }
60e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  };
61e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith
62e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  template<typename T>
63e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  void f() {
64e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    int a; // expected-warning {{unused variable 'a'}}
65e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    T b; // expected-warning 2{{unused variable 'b'}}
66e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  }
67e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith
68e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  void g() {
69e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    S<int>().f(); // expected-note {{here}}
70e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    S<char>().f(); // expected-note {{here}}
71e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    f<int>(); // expected-note {{here}}
72e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith    f<char>(); // expected-note {{here}}
73e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith  }
74e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith}
751a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola
761a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindolanamespace PR11550 {
771a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  struct S1 {
781a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S1();
791a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  };
801a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  S1 makeS1();
811a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  void testS1(S1 a) {
821a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    // This constructor call can be elided.
831a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S1 x = makeS1(); // expected-warning {{unused variable 'x'}}
841a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola
851a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    // This one cannot, so no warning.
861a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S1 y;
871a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola
881a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    // This call cannot, but the constructor is trivial.
891a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S1 z = a; // expected-warning {{unused variable 'z'}}
901a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  }
911a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola
921a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  // The same is true even when we know thet constructor has side effects.
931a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  void foo();
941a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  struct S2 {
951a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S2() {
961a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola      foo();
971a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    }
981a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  };
991a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  S2 makeS2();
1001a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  void testS2(S2 a) {
1011a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S2 x = makeS2(); // expected-warning {{unused variable 'x'}}
1021a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S2 y;
1031a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S2 z = a; // expected-warning {{unused variable 'z'}}
1041a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  }
1051a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola
1061a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  // Or when the constructor is not declared by the user.
1071a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  struct S3 {
1081a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S1 m;
1091a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  };
1101a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  S3 makeS3();
1111a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  void testS3(S3 a) {
1121a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S3 x = makeS3(); // expected-warning {{unused variable 'x'}}
1131a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S3 y;
1141a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola    S3 z = a; // expected-warning {{unused variable 'z'}}
1151a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola  }
1161a5d35539a16f3b2eb2426f3f23a8376b190741cRafael Espindola}
11739e177692ea2096af2ad0dcead79250b50958fa3David Blaikie
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR19305 {
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int n = 0; // no warning
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int a = n<int>;
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> const int l = 0; // no warning
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int b = l<int>;
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // PR19558
1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> const int o = 0; // no warning
1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> const int o<T*> = 0; // no warning
1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int c = o<int*>;
1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<> int o<void> = 0; // no warning
1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  int d = o<void>;
1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: It'd be nice to warn here.
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int m = 0;
1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> int m<T*> = 0;
1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<> const int m<void> = 0; // expected-warning {{unused variable}}
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
14039e177692ea2096af2ad0dcead79250b50958fa3David Blaikienamespace ctor_with_cleanups {
14139e177692ea2096af2ad0dcead79250b50958fa3David Blaikie  struct S1 {
14239e177692ea2096af2ad0dcead79250b50958fa3David Blaikie    ~S1();
14339e177692ea2096af2ad0dcead79250b50958fa3David Blaikie  };
14439e177692ea2096af2ad0dcead79250b50958fa3David Blaikie  struct S2 {
14539e177692ea2096af2ad0dcead79250b50958fa3David Blaikie    S2(const S1&);
14639e177692ea2096af2ad0dcead79250b50958fa3David Blaikie  };
14739e177692ea2096af2ad0dcead79250b50958fa3David Blaikie  void func() {
14839e177692ea2096af2ad0dcead79250b50958fa3David Blaikie    S2 s((S1()));
14939e177692ea2096af2ad0dcead79250b50958fa3David Blaikie  }
15039e177692ea2096af2ad0dcead79250b50958fa3David Blaikie}
15119b6a707a86302adc80d64464cbc3cb8a7a7f3a6Matt Beaumont-Gay
15219b6a707a86302adc80d64464cbc3cb8a7a7f3a6Matt Beaumont-Gay#include "Inputs/warn-unused-variables.h"
153