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