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