11b2ad2fd9e2d5352144481aa1fd995d333d9adc9Argyrios Kyrtzidis// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -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 11839e177692ea2096af2ad0dcead79250b50958fa3David Blaikienamespace ctor_with_cleanups { 11939e177692ea2096af2ad0dcead79250b50958fa3David Blaikie struct S1 { 12039e177692ea2096af2ad0dcead79250b50958fa3David Blaikie ~S1(); 12139e177692ea2096af2ad0dcead79250b50958fa3David Blaikie }; 12239e177692ea2096af2ad0dcead79250b50958fa3David Blaikie struct S2 { 12339e177692ea2096af2ad0dcead79250b50958fa3David Blaikie S2(const S1&); 12439e177692ea2096af2ad0dcead79250b50958fa3David Blaikie }; 12539e177692ea2096af2ad0dcead79250b50958fa3David Blaikie void func() { 12639e177692ea2096af2ad0dcead79250b50958fa3David Blaikie S2 s((S1())); 12739e177692ea2096af2ad0dcead79250b50958fa3David Blaikie } 12839e177692ea2096af2ad0dcead79250b50958fa3David Blaikie} 12919b6a707a86302adc80d64464cbc3cb8a7a7f3a6Matt Beaumont-Gay 13019b6a707a86302adc80d64464cbc3cb8a7a7f3a6Matt Beaumont-Gay#include "Inputs/warn-unused-variables.h" 131