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