blob: 49ca8610f28fa7250b43912dfe037dc7478513b0 [file] [log] [blame]
Richard Smith87162c22012-04-17 22:30:01 +00001// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -verify -fexceptions -fcxx-exceptions -triple x86_64-linux-gnu | FileCheck %s
Richard Smithe6975e92012-04-17 00:58:00 +00002
Richard Smith87162c22012-04-17 22:30:01 +00003void h();
4
5template<typename T> void f() noexcept(sizeof(T) == 4) { h(); }
Richard Smith13bffc52012-04-19 00:08:28 +00006template<typename T> void g() noexcept(sizeof(T) == 4);
Richard Smith87162c22012-04-17 22:30:01 +00007
8template<typename T> struct S {
9 static void f() noexcept(sizeof(T) == 4) { h(); }
Richard Smith13bffc52012-04-19 00:08:28 +000010 static void g() noexcept(sizeof(T) == 4);
Richard Smith87162c22012-04-17 22:30:01 +000011};
12
Bill Wendlingbe9e8bf2013-02-28 22:49:57 +000013// CHECK: define {{.*}} @_Z1fIsEvv() [[NONE:#[0-9]+]] {
Richard Smith87162c22012-04-17 22:30:01 +000014template<> void f<short>() { h(); }
Bill Wendling89924572013-02-27 00:06:04 +000015// CHECK: define {{.*}} @_Z1fIA2_sEvv() [[NUW:#[0-9]+]] {
Richard Smith87162c22012-04-17 22:30:01 +000016template<> void f<short[2]>() noexcept { h(); }
17
18// CHECK: define {{.*}} @_ZN1SIsE1fEv()
Bill Wendling89924572013-02-27 00:06:04 +000019// CHECK-NOT: [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000020template<> void S<short>::f() { h(); }
Bill Wendling89924572013-02-27 00:06:04 +000021// CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000022template<> void S<short[2]>::f() noexcept { h(); }
23
Bill Wendlingbe9e8bf2013-02-28 22:49:57 +000024// CHECK: define {{.*}} @_Z1fIDsEvv() [[NONE]] {
Richard Smith87162c22012-04-17 22:30:01 +000025template void f<char16_t>();
Bill Wendling89924572013-02-27 00:06:04 +000026// CHECK: define {{.*}} @_Z1fIA2_DsEvv() [[NUW]] {
Richard Smith87162c22012-04-17 22:30:01 +000027template void f<char16_t[2]>();
28
29// CHECK: define {{.*}} @_ZN1SIDsE1fEv()
Bill Wendling89924572013-02-27 00:06:04 +000030// CHECK-NOT: [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000031template void S<char16_t>::f();
Bill Wendling89924572013-02-27 00:06:04 +000032// CHECK: define {{.*}} @_ZN1SIA2_DsE1fEv() [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000033template void S<char16_t[2]>::f();
Richard Smithe6975e92012-04-17 00:58:00 +000034
Richard Smith13bffc52012-04-19 00:08:28 +000035void h() {
Bill Wendling89924572013-02-27 00:06:04 +000036 // CHECK: define {{.*}} @_Z1fIiEvv() [[NUW]] {
Richard Smithe6975e92012-04-17 00:58:00 +000037 f<int>();
Bill Wendlingbe9e8bf2013-02-28 22:49:57 +000038 // CHECK: define {{.*}} @_Z1fIA2_iEvv() [[NONE]] {
Richard Smithe6975e92012-04-17 00:58:00 +000039 f<int[2]>();
Richard Smith87162c22012-04-17 22:30:01 +000040
Bill Wendling89924572013-02-27 00:06:04 +000041 // CHECK: define {{.*}} @_ZN1SIiE1fEv() [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000042 S<int>::f();
43 // CHECK: define {{.*}} @_ZN1SIA2_iE1fEv()
Bill Wendling89924572013-02-27 00:06:04 +000044 // CHECK-NOT: [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000045 S<int[2]>::f();
46
Bill Wendling89924572013-02-27 00:06:04 +000047 // CHECK: define {{.*}} @_Z1fIfEvv() [[NUW]] {
Richard Smithe6975e92012-04-17 00:58:00 +000048 void (*f1)() = &f<float>;
Bill Wendlingbe9e8bf2013-02-28 22:49:57 +000049 // CHECK: define {{.*}} @_Z1fIdEvv() [[NONE]] {
Richard Smithe6975e92012-04-17 00:58:00 +000050 void (*f2)() = &f<double>;
Richard Smith87162c22012-04-17 22:30:01 +000051
Bill Wendling89924572013-02-27 00:06:04 +000052 // CHECK: define {{.*}} @_ZN1SIfE1fEv() [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000053 void (*f3)() = &S<float>::f;
54 // CHECK: define {{.*}} @_ZN1SIdE1fEv()
Bill Wendling89924572013-02-27 00:06:04 +000055 // CHECK-NOT: [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000056 void (*f4)() = &S<double>::f;
57
Bill Wendling89924572013-02-27 00:06:04 +000058 // CHECK: define {{.*}} @_Z1fIA4_cEvv() [[NUW]] {
Richard Smithe6975e92012-04-17 00:58:00 +000059 (void)&f<char[4]>;
Bill Wendlingbe9e8bf2013-02-28 22:49:57 +000060 // CHECK: define {{.*}} @_Z1fIcEvv() [[NONE]] {
Richard Smithe6975e92012-04-17 00:58:00 +000061 (void)&f<char>;
Richard Smith87162c22012-04-17 22:30:01 +000062
Bill Wendling89924572013-02-27 00:06:04 +000063 // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000064 (void)&S<char[4]>::f;
65 // CHECK: define {{.*}} @_ZN1SIcE1fEv()
Bill Wendling89924572013-02-27 00:06:04 +000066 // CHECK-NOT: [[NUW]]
Richard Smith87162c22012-04-17 22:30:01 +000067 (void)&S<char>::f;
Richard Smithe6975e92012-04-17 00:58:00 +000068}
Richard Smith13bffc52012-04-19 00:08:28 +000069
70// CHECK: define {{.*}} @_Z1iv
71void i() {
Bill Wendling89924572013-02-27 00:06:04 +000072 // CHECK: declare {{.*}} @_Z1gIiEvv() [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000073 g<int>();
74 // CHECK: declare {{.*}} @_Z1gIA2_iEvv()
Bill Wendling89924572013-02-27 00:06:04 +000075 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000076 g<int[2]>();
77
Bill Wendling89924572013-02-27 00:06:04 +000078 // CHECK: declare {{.*}} @_ZN1SIiE1gEv() [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000079 S<int>::g();
80 // CHECK: declare {{.*}} @_ZN1SIA2_iE1gEv()
Bill Wendling89924572013-02-27 00:06:04 +000081 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000082 S<int[2]>::g();
83
Bill Wendling89924572013-02-27 00:06:04 +000084 // CHECK: declare {{.*}} @_Z1gIfEvv() [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000085 void (*g1)() = &g<float>;
86 // CHECK: declare {{.*}} @_Z1gIdEvv()
Bill Wendling89924572013-02-27 00:06:04 +000087 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000088 void (*g2)() = &g<double>;
89
Bill Wendling89924572013-02-27 00:06:04 +000090 // CHECK: declare {{.*}} @_ZN1SIfE1gEv() [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000091 void (*g3)() = &S<float>::g;
92 // CHECK: declare {{.*}} @_ZN1SIdE1gEv()
Bill Wendling89924572013-02-27 00:06:04 +000093 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000094 void (*g4)() = &S<double>::g;
95
Bill Wendling89924572013-02-27 00:06:04 +000096 // CHECK: declare {{.*}} @_Z1gIA4_cEvv() [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +000097 (void)&g<char[4]>;
98 // CHECK: declare {{.*}} @_Z1gIcEvv()
Bill Wendling89924572013-02-27 00:06:04 +000099 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +0000100 (void)&g<char>;
101
Bill Wendling89924572013-02-27 00:06:04 +0000102 // CHECK: declare {{.*}} @_ZN1SIA4_cE1gEv() [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +0000103 (void)&S<char[4]>::g;
104 // CHECK: declare {{.*}} @_ZN1SIcE1gEv()
Bill Wendling89924572013-02-27 00:06:04 +0000105 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +0000106 (void)&S<char>::g;
107}
108
109template<typename T> struct Nested {
110 template<bool b, typename U> void f() noexcept(sizeof(T) == sizeof(U));
111};
112
113// CHECK: define {{.*}} @_Z1jv
114void j() {
115 // CHECK: declare {{.*}} @_ZN6NestedIiE1fILb1EcEEvv(
Bill Wendling89924572013-02-27 00:06:04 +0000116 // CHECK-NOT: [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +0000117 Nested<int>().f<true, char>();
Bill Wendling89924572013-02-27 00:06:04 +0000118 // CHECK: declare {{.*}} @_ZN6NestedIlE1fILb0ElEEvv({{.*}}) [[NUW]]
Richard Smith13bffc52012-04-19 00:08:28 +0000119 Nested<long>().f<false, long>();
120}
Bill Wendlingf7a9da02013-02-20 07:22:19 +0000121
Bill Wendlingbe9e8bf2013-02-28 22:49:57 +0000122// CHECK: attributes [[NONE]] = { {{.*}} }
123// CHECK: attributes [[NUW]] = { nounwind{{.*}} }