Home | History | Annotate | Download | only in dcl.attr.noreturn
      1 // RUN: %clang_cc1 -std=c++11 -verify -fcxx-exceptions %s
      2 
      3 [[noreturn]] void a() {
      4   return; // expected-warning {{function 'a' declared 'noreturn' should not return}}
      5 }
      6 void a2 [[noreturn]] () {
      7   return; // expected-warning {{function 'a2' declared 'noreturn' should not return}}
      8 }
      9 
     10 [[noreturn, noreturn]] void b() { throw 0; } // expected-error {{attribute 'noreturn' cannot appear multiple times in an attribute specifier}}
     11 [[noreturn]] [[noreturn]] void b2() { throw 0; } // ok
     12 
     13 [[noreturn()]] void c(); // expected-error {{attribute 'noreturn' cannot have an argument list}}
     14 
     15 void d() [[noreturn]]; // expected-error {{'noreturn' attribute cannot be applied to types}}
     16 int d2 [[noreturn]]; // expected-error {{'noreturn' attribute only applies to functions and methods}}
     17 
     18 [[noreturn]] int e() { b2(); } // ok
     19 
     20 int f(); // expected-note {{declaration missing '[[noreturn]]' attribute is here}}
     21 [[noreturn]] int f(); // expected-error {{function declared '[[noreturn]]' after its first declaration}}
     22 int f();
     23 
     24 [[noreturn]] int g();
     25 int g() { while (true) b(); } // ok
     26 [[noreturn]] int g();
     27 
     28 [[gnu::noreturn]] int h();
     29 
     30 template<typename T> void test_type(T) { T::error; } // expected-error {{has no members}}
     31 template<> void test_type(int (*)()) {}
     32 
     33 void check() {
     34   // We do not consider [[noreturn]] to be part of the function's type.
     35   // However, we do treat [[gnu::noreturn]] as being part of the type.
     36   //
     37   // This isn't quite GCC-compatible; it treats [[gnu::noreturn]] as
     38   // being part of a function *pointer* type, but not being part of
     39   // a function type.
     40   test_type(e);
     41   test_type(f);
     42   test_type(g);
     43   test_type(h); // expected-note {{instantiation}}
     44 }
     45