112e0c13819f09162aa8ff1036351be4f97839caeJordan Rose// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -analyze -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
212e0c13819f09162aa8ff1036351be4f97839caeJordan Rose// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -analyze -analyzer-store=region -analyzer-constraints=range -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
30979d80615df97c675423de631c1b884819f4712Mike Stump
443f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek//===----------------------------------------------------------------------===//
543f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek// Basic dead store checking (but in C++ mode).
643f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek//===----------------------------------------------------------------------===//
743f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek
80979d80615df97c675423de631c1b884819f4712Mike Stumpint j;
9852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekvoid test1() {
100979d80615df97c675423de631c1b884819f4712Mike Stump  int x = 4;
110979d80615df97c675423de631c1b884819f4712Mike Stump
12f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek  x = x + 1; // expected-warning{{never read}}
130979d80615df97c675423de631c1b884819f4712Mike Stump
140979d80615df97c675423de631c1b884819f4712Mike Stump  switch (j) {
150979d80615df97c675423de631c1b884819f4712Mike Stump  case 1:
160979d80615df97c675423de631c1b884819f4712Mike Stump    throw 1;
170979d80615df97c675423de631c1b884819f4712Mike Stump    (void)x;
180979d80615df97c675423de631c1b884819f4712Mike Stump    break;
190979d80615df97c675423de631c1b884819f4712Mike Stump  }
200979d80615df97c675423de631c1b884819f4712Mike Stump}
2143f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek
2243f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek//===----------------------------------------------------------------------===//
2343f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek// Dead store checking involving constructors.
2443f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek//===----------------------------------------------------------------------===//
2543f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek
26852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekclass Test2 {
2743f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek  int &x;
2843f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenekpublic:
29852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  Test2(int &y) : x(y) {}
30852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  ~Test2() { ++x; }
3143f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek};
3243f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek
33852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekint test2(int x) {
34852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  { Test2 a(x); } // no-warning
3543f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek  return x;
3643f19e3136a9610eeba3cdef9f9af70d93df2f7eTed Kremenek}
37852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
38852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek//===----------------------------------------------------------------------===//
39604d939ac15d1398761df313679673d30bb10f27Ted Kremenek// Dead store checking involving CXXTemporaryExprs
40604d939ac15d1398761df313679673d30bb10f27Ted Kremenek//===----------------------------------------------------------------------===//
41604d939ac15d1398761df313679673d30bb10f27Ted Kremenek
42604d939ac15d1398761df313679673d30bb10f27Ted Kremeneknamespace TestTemp {
43604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  template<typename _Tp>
44604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  class pencil {
45604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  public:
46604d939ac15d1398761df313679673d30bb10f27Ted Kremenek    ~pencil() throw() {}
47604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  };
48604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  template<typename _Tp, typename _Number2> struct _Row_base {
49604d939ac15d1398761df313679673d30bb10f27Ted Kremenek    _Row_base(const pencil<_Tp>& x) {}
50604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  };
51604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  template<typename _Tp, typename _Number2 = TestTemp::pencil<_Tp> >
52604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  class row : protected _Row_base<_Tp, _Number2>     {
53604d939ac15d1398761df313679673d30bb10f27Ted Kremenek    typedef _Row_base<_Tp, _Number2> _Base;
54604d939ac15d1398761df313679673d30bb10f27Ted Kremenek    typedef _Number2 pencil_type;
55604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  public:
56604d939ac15d1398761df313679673d30bb10f27Ted Kremenek    explicit row(const pencil_type& __a = pencil_type()) : _Base(__a) {}
57604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  };
58604d939ac15d1398761df313679673d30bb10f27Ted Kremenek}
59604d939ac15d1398761df313679673d30bb10f27Ted Kremenek
60604d939ac15d1398761df313679673d30bb10f27Ted Kremenekvoid test2_b() {
61604d939ac15d1398761df313679673d30bb10f27Ted Kremenek  TestTemp::row<const char*> x; // no-warning
62604d939ac15d1398761df313679673d30bb10f27Ted Kremenek}
63604d939ac15d1398761df313679673d30bb10f27Ted Kremenek
64604d939ac15d1398761df313679673d30bb10f27Ted Kremenek//===----------------------------------------------------------------------===//
65852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek// Test references.
66852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek//===----------------------------------------------------------------------===//
67852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
68852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekvoid test3_a(int x) {
69f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek   x = x + 1; // expected-warning{{never read}}
70852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek}
71852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
72852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekvoid test3_b(int &x) {
73f4e532b5a1683a9f6c842f361c7415bf3474315fTed Kremenek  x = x + 1; // no-warninge
74852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek}
75852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
76852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekvoid test3_c(int x) {
77852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  int &y = x;
78852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  // Shows the limitation of dead stores tracking.  The write is really
79852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  // dead since the value cannot escape the function.
80852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  ++y; // no-warning
81852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek}
82852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
83852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekvoid test3_d(int &x) {
84852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  int &y = x;
85852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  ++y; // no-warning
86852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek}
87852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
88852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenekvoid test3_e(int &x) {
89852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek  int &y = x;
90852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek}
91852274d4257134906995cb252fb3dfd2d71deae8Ted Kremenek
92a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek//===----------------------------------------------------------------------===//
93a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek// Dead stores involving 'new'
94a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek//===----------------------------------------------------------------------===//
95a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek
96a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenekstatic void test_new(unsigned n) {
97a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek  char **p = new char* [n]; // expected-warning{{never read}}
98a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek}
99a006342c8650738c7e3547a1a0a70334608c5db6Ted Kremenek
10014cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek//===----------------------------------------------------------------------===//
10114cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek// Dead stores in namespaces.
10214cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek//===----------------------------------------------------------------------===//
10314cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek
10414cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremeneknamespace foo {
10514cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek  int test_4(int x) {
10614cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek    x = 2; // expected-warning{{Value stored to 'x' is never read}}
10714cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek    x = 2;
10814cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek    return x;
10914cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek  }
11014cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek}
11114cc9451de4a9539bf79e4e5d63248c2377426dbTed Kremenek
1122827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek//===----------------------------------------------------------------------===//
1132827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek// Dead stores in with EH code.
1142827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek//===----------------------------------------------------------------------===//
1152827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek
1162827f5af018c515986ffb1779ec2e7246988f150Ted Kremenekvoid test_5_Aux();
1172827f5af018c515986ffb1779ec2e7246988f150Ted Kremenekint test_5() {
1182827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek  int x = 0;
1192827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek  try {
1202827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek    x = 2; // no-warning
1212827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek    test_5_Aux();
1222827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek  }
1232827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek  catch (int z) {
1242827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek    return x + z;
1252827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek  }
1262827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek  return 1;
1272827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek}
1282827f5af018c515986ffb1779ec2e7246988f150Ted Kremenek
1298f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek
1308f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenekint test_6_aux(unsigned x);
1318f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek
1328f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenekvoid test_6() {
1338f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  unsigned currDestLen = 0;  // no-warning
1348f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  try {
1358f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek    while (test_6_aux(currDestLen)) {
1368f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek      currDestLen += 2; // no-warning
1378f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek    }
1388f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  }
1398f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  catch (void *) {}
1408f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek}
1418f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek
1428f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenekvoid test_6b() {
1438f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  unsigned currDestLen = 0;  // no-warning
1448f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  try {
1458f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek    while (test_6_aux(currDestLen)) {
1468f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek      currDestLen += 2; // expected-warning {{Value stored to 'currDestLen' is never read}}
1478f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek      break;
1488f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek    }
1498f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  }
1508f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek  catch (void *) {}
1518f81acfa95a5d2a22fc875c1a10901eaa30b8405Ted Kremenek}
15212e0c13819f09162aa8ff1036351be4f97839caeJordan Rose
15312e0c13819f09162aa8ff1036351be4f97839caeJordan Rose
15412e0c13819f09162aa8ff1036351be4f97839caeJordan Rosevoid testCXX11Using() {
15512e0c13819f09162aa8ff1036351be4f97839caeJordan Rose  using Int = int;
15612e0c13819f09162aa8ff1036351be4f97839caeJordan Rose  Int value;
15712e0c13819f09162aa8ff1036351be4f97839caeJordan Rose  value = 1; // expected-warning {{never read}}
15812e0c13819f09162aa8ff1036351be4f97839caeJordan Rose}
159724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek
160724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek//===----------------------------------------------------------------------===//
161724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek// Dead stores in template instantiations (do not warn).
162724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek//===----------------------------------------------------------------------===//
163724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek
164724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenektemplate <bool f> int radar13213575_testit(int i) {
165724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek  int x = 5+i; // warning: Value stored to 'x' during its initialization is never read
166724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek  int y = 7;
167724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek  if (f)
168724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek    return x;
169724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek  else
170724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek    return y;
171724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek}
172724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek
173724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenekint radar_13213575() {
174724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek  return radar13213575_testit<true>(5) + radar13213575_testit<false>(3);
175724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek}
176724cfee8b506ffef6f55e556a3329a7403ef7198Ted Kremenek
177