1f978886eSReid Kleckner // RUN: %clang_cc1 -fsyntax-only -verify %s
2f978886eSReid Kleckner 
3f978886eSReid Kleckner // Split from function-template-specialization.cpp because the noreturn warning
4f978886eSReid Kleckner // requires analysis-based warnings, which the other errors in that test case
5f978886eSReid Kleckner // disable.
6f978886eSReid Kleckner 
f3()7f978886eSReid Kleckner template <int N> void __attribute__((noreturn)) f3() { __builtin_unreachable(); }
f3()8f978886eSReid Kleckner template <> void f3<1>() { } // expected-warning {{function declared 'noreturn' should not return}}
9*e497438cSNico Weber 
10*e497438cSNico Weber #if __cplusplus >= 201103L
11*e497438cSNico Weber namespace PR21942 {
12*e497438cSNico Weber template <int>
13*e497438cSNico Weber struct A {
14*e497438cSNico Weber   void foo[[noreturn]]();
15*e497438cSNico Weber };
16*e497438cSNico Weber 
17*e497438cSNico Weber template <>
foo()18*e497438cSNico Weber void A<0>::foo() {} // expected-warning{{function declared 'noreturn' should not return}}
19*e497438cSNico Weber }
20*e497438cSNico Weber #endif
21