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