cxx11-exception-spec.cpp revision f7a9da053f5bd6c18450c1796d953b42c3b7ad3a
187162c2e528921aabb84e96fe7272348a4b3354eRichard Smith// RUN: %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
13f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: define {{.*}} @_Z1fIsEvv() #0 {
1487162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void f<short>() { h(); }
15f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: define {{.*}} @_Z1fIA2_sEvv() #1 {
1687162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void f<short[2]>() noexcept { h(); }
1787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
1887162c2e528921aabb84e96fe7272348a4b3354eRichard Smith// CHECK: define {{.*}} @_ZN1SIsE1fEv()
19f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK-NOT: #1
2087162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void S<short>::f() { h(); }
21f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() #1
2287162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate<> void S<short[2]>::f() noexcept { h(); }
2387162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
24f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: define {{.*}} @_Z1fIDsEvv() #0 {
2587162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void f<char16_t>();
26f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: define {{.*}} @_Z1fIA2_DsEvv() #1  {
2787162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void f<char16_t[2]>();
2887162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
2987162c2e528921aabb84e96fe7272348a4b3354eRichard Smith// CHECK: define {{.*}} @_ZN1SIDsE1fEv()
30f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK-NOT: #1
3187162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void S<char16_t>::f();
32f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: define {{.*}} @_ZN1SIA2_DsE1fEv() #1
3387162c2e528921aabb84e96fe7272348a4b3354eRichard Smithtemplate void S<char16_t[2]>::f();
34e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith
3513bffc532bafd45d4a77867993c1afb83c7661beRichard Smithvoid h() {
36f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_Z1fIiEvv() #1 {
37e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  f<int>();
38f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_Z1fIA2_iEvv() #0 {
39e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  f<int[2]>();
4087162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
41f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_ZN1SIiE1fEv() #1
4287162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  S<int>::f();
4387162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  // CHECK: define {{.*}} @_ZN1SIA2_iE1fEv()
44f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
4587162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  S<int[2]>::f();
4687162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
47f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_Z1fIfEvv() #1 {
48e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  void (*f1)() = &f<float>;
49f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_Z1fIdEvv() #0 {
50e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  void (*f2)() = &f<double>;
5187162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
52f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_ZN1SIfE1fEv() #1
5387162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  void (*f3)() = &S<float>::f;
5487162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  // CHECK: define {{.*}} @_ZN1SIdE1fEv()
55f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
5687162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  void (*f4)() = &S<double>::f;
5787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
58f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_Z1fIA4_cEvv() #1 {
59e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  (void)&f<char[4]>;
60f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_Z1fIcEvv() #0 {
61e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith  (void)&f<char>;
6287162c2e528921aabb84e96fe7272348a4b3354eRichard Smith
63f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() #1
6487162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  (void)&S<char[4]>::f;
6587162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  // CHECK: define {{.*}} @_ZN1SIcE1fEv()
66f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
6787162c2e528921aabb84e96fe7272348a4b3354eRichard Smith  (void)&S<char>::f;
68e6975e9b0985ad7f7ff9187e38d95bfe9ac4181bRichard Smith}
6913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
7013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith// CHECK: define {{.*}} @_Z1iv
7113bffc532bafd45d4a77867993c1afb83c7661beRichard Smithvoid i() {
72f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_Z1gIiEvv() #1
7313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  g<int>();
7413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_Z1gIA2_iEvv()
75f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
7613bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  g<int[2]>();
7713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
78f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_ZN1SIiE1gEv() #1
7913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  S<int>::g();
8013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN1SIA2_iE1gEv()
81f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
8213bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  S<int[2]>::g();
8313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
84f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_Z1gIfEvv() #1
8513bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g1)() = &g<float>;
8613bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_Z1gIdEvv()
87f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
8813bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g2)() = &g<double>;
8913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
90f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_ZN1SIfE1gEv() #1
9113bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g3)() = &S<float>::g;
9213bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN1SIdE1gEv()
93f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
9413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  void (*g4)() = &S<double>::g;
9513bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
96f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_Z1gIA4_cEvv() #1
9713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&g<char[4]>;
9813bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_Z1gIcEvv()
99f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
10013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&g<char>;
10113bffc532bafd45d4a77867993c1afb83c7661beRichard Smith
102f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_ZN1SIA4_cE1gEv() #1
10313bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  (void)&S<char[4]>::g;
10413bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  // CHECK: declare {{.*}} @_ZN1SIcE1gEv()
105f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
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(
116f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK-NOT: #1
11713bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  Nested<int>().f<true, char>();
118f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling  // CHECK: declare {{.*}} @_ZN6NestedIlE1fILb0ElEEvv({{.*}}) #1
11913bffc532bafd45d4a77867993c1afb83c7661beRichard Smith  Nested<long>().f<false, long>();
12013bffc532bafd45d4a77867993c1afb83c7661beRichard Smith}
121f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
122f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: attributes #0 = { "target-features"={{.*}} }
123f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: attributes #1 = { nounwind "target-features"={{.*}} }
124f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling// CHECK: attributes #2 = { noinline noreturn nounwind }
125