196e7813f08c6adf1d8657b0da86741b54e850fd7Rafael Espindola// RUN: not %clang_cc1 -std=c++11 -emit-llvm %s -o - -verify -fexceptions -fcxx-exceptions -triple x86_64-linux-gnu | FileCheck %s
2e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith
387162c2e528921aabb84e96fe7272348a4b3354eRichard Smithvoid h();
487162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
587162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<typename T> void f() noexcept(sizeof(T) == 4) { h(); }
613bffc532bafd45d4a77867993c1afb83c7661beRichard Smithtemplate<typename T> void g() noexcept(sizeof(T) == 4);
787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
887162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<typename T> struct S {
987162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  static void f() noexcept(sizeof(T) == 4) { h(); }
1013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  static void g() noexcept(sizeof(T) == 4);
1187162c2e528921aabb84e96fe7272348a4b3354eRichard Smith};
1287162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
13be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK: define {{.*}} @_Z1fIsEvv() [[NONE:#[0-9]+]] {
1487162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void f<short>() { h(); }
15899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK: define {{.*}} @_Z1fIA2_sEvv() [[NUW:#[0-9]+]] {
1687162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void f<short[2]>() noexcept { h(); }
1787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
1887162c2e528921aabb84e96fe7272348a4b3354eRichard Smith// CHECK: define {{.*}} @_ZN1SIsE1fEv()
19899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK-NOT: [[NUW]]
2087162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void S<short>::f() { h(); }
21899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() [[NUW]]
2287162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void S<short[2]>::f() noexcept { h(); }
2387162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
24be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK: define {{.*}} @_Z1fIDsEvv() [[NONE]] {
2587162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void f<char16_t>();
26899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK: define {{.*}} @_Z1fIA2_DsEvv() [[NUW]]  {
2787162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void f<char16_t[2]>();
2887162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
2987162c2e528921aabb84e96fe7272348a4b3354eRichard Smith// CHECK: define {{.*}} @_ZN1SIDsE1fEv()
30899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK-NOT: [[NUW]]
3187162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void S<char16_t>::f();
32899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK: define {{.*}} @_ZN1SIA2_DsE1fEv() [[NUW]]
3387162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void S<char16_t[2]>::f();
34e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith
3513bffc532bafd45d4a77867993c1afb83c7661beRichard Smithvoid h() {
36899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: define {{.*}} @_Z1fIiEvv() [[NUW]] {
37e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  f<int>();
38be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling  // CHECK: define {{.*}} @_Z1fIA2_iEvv() [[NONE]] {
39e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  f<int[2]>();
4087162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
41899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: define {{.*}} @_ZN1SIiE1fEv() [[NUW]]
4287162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  S<int>::f();
4387162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  // CHECK: define {{.*}} @_ZN1SIA2_iE1fEv()
44899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
4587162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  S<int[2]>::f();
4687162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
47899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: define {{.*}} @_Z1fIfEvv() [[NUW]] {
48e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  void (*f1)() = &f<float>;
49be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling  // CHECK: define {{.*}} @_Z1fIdEvv() [[NONE]] {
50e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  void (*f2)() = &f<double>;
5187162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
52899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: define {{.*}} @_ZN1SIfE1fEv() [[NUW]]
5387162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  void (*f3)() = &S<float>::f;
5487162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  // CHECK: define {{.*}} @_ZN1SIdE1fEv()
55899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
5687162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  void (*f4)() = &S<double>::f;
5787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
58899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: define {{.*}} @_Z1fIA4_cEvv() [[NUW]] {
59e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  (void)&f<char[4]>;
60be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling  // CHECK: define {{.*}} @_Z1fIcEvv() [[NONE]] {
61e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  (void)&f<char>;
6287162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
63899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() [[NUW]]
6487162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  (void)&S<char[4]>::f;
6587162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  // CHECK: define {{.*}} @_ZN1SIcE1fEv()
66899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
6787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  (void)&S<char>::f;
68e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith}
6913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
7013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith// CHECK: define {{.*}} @_Z1iv
7113bffc532bafd45d4a77867993c1afb83c7661beRichard Smithvoid i() {
72899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_Z1gIiEvv() [[NUW]]
7313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  g<int>();
7413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_Z1gIA2_iEvv()
75899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
7613bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  g<int[2]>();
7713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
78899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_ZN1SIiE1gEv() [[NUW]]
7913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  S<int>::g();
8013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN1SIA2_iE1gEv()
81899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
8213bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  S<int[2]>::g();
8313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
84899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_Z1gIfEvv() [[NUW]]
8513bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g1)() = &g<float>;
8613bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_Z1gIdEvv()
87899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
8813bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g2)() = &g<double>;
8913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
90899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_ZN1SIfE1gEv() [[NUW]]
9113bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g3)() = &S<float>::g;
9213bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN1SIdE1gEv()
93899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
9413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g4)() = &S<double>::g;
9513bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
96899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_Z1gIA4_cEvv() [[NUW]]
9713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&g<char[4]>;
9813bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_Z1gIcEvv()
99899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
10013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&g<char>;
10113bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
102899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_ZN1SIA4_cE1gEv() [[NUW]]
10313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&S<char[4]>::g;
10413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN1SIcE1gEv()
105899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
10613bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&S<char>::g;
10713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith}
10813bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
10913bffc532bafd45d4a77867993c1afb83c7661beRichard Smithtemplate<typename T> struct Nested {
11013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  template<bool b, typename U> void f() noexcept(sizeof(T) == sizeof(U));
11113bffc532bafd45d4a77867993c1afb83c7661beRichard Smith};
11213bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
11313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith// CHECK: define {{.*}} @_Z1jv
11413bffc532bafd45d4a77867993c1afb83c7661beRichard Smithvoid j() {
11513bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN6NestedIiE1fILb1EcEEvv(
116899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK-NOT: [[NUW]]
11713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  Nested<int>().f<true, char>();
118899245792776dd219a3c36eb19b42272e270bc0cBill Wendling  // CHECK: declare {{.*}} @_ZN6NestedIlE1fILb0ElEEvv({{.*}}) [[NUW]]
11913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  Nested<long>().f<false, long>();
12013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith}
121f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
122be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK: attributes [[NONE]] = { {{.*}} }
123be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
124