Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 // Reachability tests have to come first because they get suppressed
      4 // if any errors have occurred.
      5 namespace test5 {
      6   struct A {
      7     __attribute__((noreturn)) void fail();
      8     void nofail();
      9   } a;
     10 
     11   int &test1() {
     12     a.nofail();
     13   } // expected-warning {{control reaches end of non-void function}}
     14 
     15   int &test2() {
     16     a.fail();
     17   }
     18 }
     19 
     20 // PR5620
     21 void f0() __attribute__((__noreturn__));
     22 void f1(void (*)());
     23 void f2() { f1(f0); }
     24 
     25 // Taking the address of a noreturn function
     26 void test_f0a() {
     27   void (*fp)() = f0;
     28   void (*fp1)() __attribute__((noreturn)) = f0;
     29 }
     30 
     31 // Taking the address of an overloaded noreturn function
     32 void f0(int) __attribute__((__noreturn__));
     33 
     34 void test_f0b() {
     35   void (*fp)() = f0;
     36   void (*fp1)() __attribute__((noreturn)) = f0;
     37 }
     38 
     39 // No-returned function pointers
     40 typedef void (* noreturn_fp)() __attribute__((noreturn));
     41 
     42 void f3(noreturn_fp); // expected-note{{candidate function}}
     43 
     44 void test_f3() {
     45   f3(f0); // okay
     46   f3(f2); // expected-error{{no matching function for call}}
     47 }
     48 
     49 
     50 class xpto {
     51   int blah() __attribute__((noreturn));
     52 };
     53 
     54 int xpto::blah() {
     55   return 3; // expected-warning {{function 'blah' declared 'noreturn' should not return}}
     56 }
     57 
     58 // PR12948
     59 
     60 namespace PR12948 {
     61   template<int>
     62   void foo() __attribute__((__noreturn__));
     63 
     64   template<int>
     65   void foo() {
     66     while (1) continue;
     67   }
     68 
     69   void bar() __attribute__((__noreturn__));
     70 
     71   void bar() {
     72     foo<0>();
     73   }
     74 
     75 
     76   void baz() __attribute__((__noreturn__));
     77   typedef void voidfn();
     78   voidfn baz;
     79 
     80   template<typename> void wibble()  __attribute__((__noreturn__));
     81   template<typename> voidfn wibble;
     82 }
     83