1abea951c34876a5374d0e3678c7989b225c5c895Anders Carlsson// RUN: %clang_cc1 %s -fcxx-exceptions -fexceptions -fsyntax-only -verify -fblocks -Wunreachable-code -Wno-unused-value 24c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump 35d1d7ae120c2c8e6cba5d2a712b33500a5aecc10Anders Carlssonint &halt() __attribute__((noreturn)); 455f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stumpint &live(); 54c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stumpint dead(); 64c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stumpint liveti() throw(int); 74c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stumpint (*livetip)() throw(int); 84c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump 94c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stumpint test1() { 104c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump try { 114c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump live(); 124c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } catch (int i) { 134c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump live(); 144c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } 154c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump return 1; 164c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump} 174c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump 184c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stumpvoid test2() { 194c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump try { 204c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump live(); 214c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } catch (int i) { 224c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump live(); 234c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } 244c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump try { 254c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump liveti(); 264c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } catch (int i) { 274c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump live(); 284c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } 294c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump try { 304c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump livetip(); 314c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } catch (int i) { 324c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump live(); 334c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump } 344c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump throw 1; 354c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump dead(); // expected-warning {{will never be executed}} 364c45aa1b00b91847acfb082acfaced3ffa294d1dMike Stump} 3755f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump 3855f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump 3955f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stumpvoid test3() { 4055f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump halt() 4155f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump --; // expected-warning {{will never be executed}} 427dd3c73b7d984d5cd6e0d94e5016ebed03bddfdfTed Kremenek // FIXME: The unreachable part is just the '?', but really all of this 437dd3c73b7d984d5cd6e0d94e5016ebed03bddfdfTed Kremenek // code is unreachable and shouldn't be separately reported. 447dd3c73b7d984d5cd6e0d94e5016ebed03bddfdfTed Kremenek halt() // expected-warning {{will never be executed}} 457dd3c73b7d984d5cd6e0d94e5016ebed03bddfdfTed Kremenek ? 46e5fba7058ce34cc3d75e16e777ec6fc8096183f8Mike Stump dead() : dead(); 472d6ceab0ad062989ecb7b8666c85e58a2fcd95ceMike Stump live(), 480c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek float 490c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek (halt()); // expected-warning {{will never be executed}} 5055f988efeb08b84c2dd9e4c05990b88c81fe2b58Mike Stump} 51b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump 52b5c775575b496c03d862ea03587a9f1d74193c9fMike Stumpvoid test4() { 53b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump struct S { 54b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump int mem; 55b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump } s; 56b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump S &foor(); 57910716678e8af41432f3dfb16b340168597f8c45Zhongxing Xu halt(), foor()// expected-warning {{will never be executed}} 58910716678e8af41432f3dfb16b340168597f8c45Zhongxing Xu .mem; 59b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump} 60b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump 61b5c775575b496c03d862ea03587a9f1d74193c9fMike Stumpvoid test5() { 62b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump struct S { 63b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump int mem; 64b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump } s; 655d1d7ae120c2c8e6cba5d2a712b33500a5aecc10Anders Carlsson S &foor() __attribute__((noreturn)); 66b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump foor() 67b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump .mem; // expected-warning {{will never be executed}} 68b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump} 69b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump 70b5c775575b496c03d862ea03587a9f1d74193c9fMike Stumpvoid test6() { 71b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump struct S { 72b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump ~S() { } 73b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump S(int i) { } 74b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump }; 75b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump live(), 760c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek S 770c8e5a0f70cbdb800d939c1807d05f380b2854d4Ted Kremenek (halt()); // expected-warning {{will never be executed}} 78b5c775575b496c03d862ea03587a9f1d74193c9fMike Stump} 795dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek 805dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek// Don't warn about unreachable code in template instantiations, as 815dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek// they may only be unreachable in that specific instantiation. 825dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenekvoid isUnreachable(); 835dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek 845dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenektemplate <typename T> void test_unreachable_templates() { 855dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek T::foo(); 865dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek isUnreachable(); // no-warning 875dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek} 885dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek 895dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenekstruct TestUnreachableA { 905dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek static void foo() __attribute__((noreturn)); 915dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek}; 925dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenekstruct TestUnreachableB { 935dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek static void foo(); 945dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek}; 955dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek 965dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenekvoid test_unreachable_templates_harness() { 975dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek test_unreachable_templates<TestUnreachableA>(); 985dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek test_unreachable_templates<TestUnreachableB>(); 995dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek} 1005dfee06daa359bbe0f3c9de055b8a02d61a05173Ted Kremenek 10175df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek// Do warn about explict template specializations, as they represent 10275df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek// actual concrete functions that somebody wrote. 10375df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek 10475df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenektemplate <typename T> void funcToSpecialize() {} 10575df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenektemplate <> void funcToSpecialize<int>() { 10675df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek halt(); 10775df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek dead(); // expected-warning {{will never be executed}} 10875df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek} 10975df4eeede7b91c22c1d63fafd4dd4142844e3b9Ted Kremenek 110