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