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