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