1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s 2// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-store=region -analyzer-constraints=range -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s 3 4//===----------------------------------------------------------------------===// 5// Basic dead store checking (but in C++ mode). 6//===----------------------------------------------------------------------===// 7 8int j; 9void test1() { 10 int x = 4; 11 12 x = x + 1; // expected-warning{{never read}} 13 14 switch (j) { 15 case 1: 16 throw 1; 17 (void)x; 18 break; 19 } 20} 21 22//===----------------------------------------------------------------------===// 23// Dead store checking involving constructors. 24//===----------------------------------------------------------------------===// 25 26class Test2 { 27 int &x; 28public: 29 Test2(int &y) : x(y) {} 30 ~Test2() { ++x; } 31}; 32 33int test2(int x) { 34 { Test2 a(x); } // no-warning 35 return x; 36} 37 38//===----------------------------------------------------------------------===// 39// Dead store checking involving CXXTemporaryExprs 40//===----------------------------------------------------------------------===// 41 42namespace TestTemp { 43 template<typename _Tp> 44 class pencil { 45 public: 46 ~pencil() throw() {} 47 }; 48 template<typename _Tp, typename _Number2> struct _Row_base { 49 _Row_base(const pencil<_Tp>& x) {} 50 }; 51 template<typename _Tp, typename _Number2 = TestTemp::pencil<_Tp> > 52 class row : protected _Row_base<_Tp, _Number2> { 53 typedef _Row_base<_Tp, _Number2> _Base; 54 typedef _Number2 pencil_type; 55 public: 56 explicit row(const pencil_type& __a = pencil_type()) : _Base(__a) {} 57 }; 58} 59 60void test2_b() { 61 TestTemp::row<const char*> x; // no-warning 62} 63 64//===----------------------------------------------------------------------===// 65// Test references. 66//===----------------------------------------------------------------------===// 67 68void test3_a(int x) { 69 x = x + 1; // expected-warning{{never read}} 70} 71 72void test3_b(int &x) { 73 x = x + 1; // no-warninge 74} 75 76void test3_c(int x) { 77 int &y = x; 78 // Shows the limitation of dead stores tracking. The write is really 79 // dead since the value cannot escape the function. 80 ++y; // no-warning 81} 82 83void test3_d(int &x) { 84 int &y = x; 85 ++y; // no-warning 86} 87 88void test3_e(int &x) { 89 int &y = x; 90} 91 92//===----------------------------------------------------------------------===// 93// Dead stores involving 'new' 94//===----------------------------------------------------------------------===// 95 96static void test_new(unsigned n) { 97 char **p = new char* [n]; // expected-warning{{never read}} 98} 99 100//===----------------------------------------------------------------------===// 101// Dead stores in namespaces. 102//===----------------------------------------------------------------------===// 103 104namespace foo { 105 int test_4(int x) { 106 x = 2; // expected-warning{{Value stored to 'x' is never read}} 107 x = 2; 108 return x; 109 } 110} 111 112//===----------------------------------------------------------------------===// 113// Dead stores in with EH code. 114//===----------------------------------------------------------------------===// 115 116void test_5_Aux(); 117int test_5() { 118 int x = 0; 119 try { 120 x = 2; // no-warning 121 test_5_Aux(); 122 } 123 catch (int z) { 124 return x + z; 125 } 126 return 1; 127} 128 129