blob: 3b1516b925361b9fa0a40853edffb6431ac5ca35 [file] [log] [blame]
Alp Toker82d14cd2013-12-14 04:49:06 +00001// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -verify -fexceptions -fcxx-exceptions -triple x86_64-linux-gnu | FileCheck %s
2// expected-no-diagnostics
Richard Smithf623c962012-04-17 00:58:00 +00003
Richard Smith79a52e52012-04-17 22:30:01 +00004void h();
5
6template<typename T> void f() noexcept(sizeof(T) == 4) { h(); }
Richard Smithd3729422012-04-19 00:08:28 +00007template<typename T> void g() noexcept(sizeof(T) == 4);
Richard Smith79a52e52012-04-17 22:30:01 +00008
9template<typename T> struct S {
10 static void f() noexcept(sizeof(T) == 4) { h(); }
Richard Smithd3729422012-04-19 00:08:28 +000011 static void g() noexcept(sizeof(T) == 4);
Richard Smith79a52e52012-04-17 22:30:01 +000012};
13
Bill Wendling706469b2013-02-28 22:49:57 +000014// CHECK: define {{.*}} @_Z1fIsEvv() [[NONE:#[0-9]+]] {
Richard Smith79a52e52012-04-17 22:30:01 +000015template<> void f<short>() { h(); }
Bill Wendling2386bb12013-02-27 00:06:04 +000016// CHECK: define {{.*}} @_Z1fIA2_sEvv() [[NUW:#[0-9]+]] {
Richard Smith79a52e52012-04-17 22:30:01 +000017template<> void f<short[2]>() noexcept { h(); }
18
19// CHECK: define {{.*}} @_ZN1SIsE1fEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000020// CHECK-NOT: [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000021template<> void S<short>::f() { h(); }
Bill Wendling2386bb12013-02-27 00:06:04 +000022// CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000023template<> void S<short[2]>::f() noexcept { h(); }
24
Bill Wendling706469b2013-02-28 22:49:57 +000025// CHECK: define {{.*}} @_Z1fIDsEvv() [[NONE]] {
Richard Smith79a52e52012-04-17 22:30:01 +000026template void f<char16_t>();
Bill Wendling2386bb12013-02-27 00:06:04 +000027// CHECK: define {{.*}} @_Z1fIA2_DsEvv() [[NUW]] {
Richard Smith79a52e52012-04-17 22:30:01 +000028template void f<char16_t[2]>();
29
30// CHECK: define {{.*}} @_ZN1SIDsE1fEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000031// CHECK-NOT: [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000032template void S<char16_t>::f();
Bill Wendling2386bb12013-02-27 00:06:04 +000033// CHECK: define {{.*}} @_ZN1SIA2_DsE1fEv() [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000034template void S<char16_t[2]>::f();
Richard Smithf623c962012-04-17 00:58:00 +000035
Richard Smithd3729422012-04-19 00:08:28 +000036void h() {
Bill Wendling2386bb12013-02-27 00:06:04 +000037 // CHECK: define {{.*}} @_Z1fIiEvv() [[NUW]] {
Richard Smithf623c962012-04-17 00:58:00 +000038 f<int>();
Bill Wendling706469b2013-02-28 22:49:57 +000039 // CHECK: define {{.*}} @_Z1fIA2_iEvv() [[NONE]] {
Richard Smithf623c962012-04-17 00:58:00 +000040 f<int[2]>();
Richard Smith79a52e52012-04-17 22:30:01 +000041
Bill Wendling2386bb12013-02-27 00:06:04 +000042 // CHECK: define {{.*}} @_ZN1SIiE1fEv() [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000043 S<int>::f();
44 // CHECK: define {{.*}} @_ZN1SIA2_iE1fEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000045 // CHECK-NOT: [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000046 S<int[2]>::f();
47
Bill Wendling2386bb12013-02-27 00:06:04 +000048 // CHECK: define {{.*}} @_Z1fIfEvv() [[NUW]] {
Richard Smithf623c962012-04-17 00:58:00 +000049 void (*f1)() = &f<float>;
Bill Wendling706469b2013-02-28 22:49:57 +000050 // CHECK: define {{.*}} @_Z1fIdEvv() [[NONE]] {
Richard Smithf623c962012-04-17 00:58:00 +000051 void (*f2)() = &f<double>;
Richard Smith79a52e52012-04-17 22:30:01 +000052
Bill Wendling2386bb12013-02-27 00:06:04 +000053 // CHECK: define {{.*}} @_ZN1SIfE1fEv() [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000054 void (*f3)() = &S<float>::f;
55 // CHECK: define {{.*}} @_ZN1SIdE1fEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000056 // CHECK-NOT: [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000057 void (*f4)() = &S<double>::f;
58
Bill Wendling2386bb12013-02-27 00:06:04 +000059 // CHECK: define {{.*}} @_Z1fIA4_cEvv() [[NUW]] {
Richard Smithf623c962012-04-17 00:58:00 +000060 (void)&f<char[4]>;
Bill Wendling706469b2013-02-28 22:49:57 +000061 // CHECK: define {{.*}} @_Z1fIcEvv() [[NONE]] {
Richard Smithf623c962012-04-17 00:58:00 +000062 (void)&f<char>;
Richard Smith79a52e52012-04-17 22:30:01 +000063
Bill Wendling2386bb12013-02-27 00:06:04 +000064 // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000065 (void)&S<char[4]>::f;
66 // CHECK: define {{.*}} @_ZN1SIcE1fEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000067 // CHECK-NOT: [[NUW]]
Richard Smith79a52e52012-04-17 22:30:01 +000068 (void)&S<char>::f;
Richard Smithf623c962012-04-17 00:58:00 +000069}
Richard Smithd3729422012-04-19 00:08:28 +000070
71// CHECK: define {{.*}} @_Z1iv
72void i() {
Bill Wendling2386bb12013-02-27 00:06:04 +000073 // CHECK: declare {{.*}} @_Z1gIiEvv() [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000074 g<int>();
75 // CHECK: declare {{.*}} @_Z1gIA2_iEvv()
Bill Wendling2386bb12013-02-27 00:06:04 +000076 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000077 g<int[2]>();
78
Bill Wendling2386bb12013-02-27 00:06:04 +000079 // CHECK: declare {{.*}} @_ZN1SIiE1gEv() [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000080 S<int>::g();
81 // CHECK: declare {{.*}} @_ZN1SIA2_iE1gEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000082 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000083 S<int[2]>::g();
84
Bill Wendling2386bb12013-02-27 00:06:04 +000085 // CHECK: declare {{.*}} @_Z1gIfEvv() [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000086 void (*g1)() = &g<float>;
87 // CHECK: declare {{.*}} @_Z1gIdEvv()
Bill Wendling2386bb12013-02-27 00:06:04 +000088 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000089 void (*g2)() = &g<double>;
90
Bill Wendling2386bb12013-02-27 00:06:04 +000091 // CHECK: declare {{.*}} @_ZN1SIfE1gEv() [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000092 void (*g3)() = &S<float>::g;
93 // CHECK: declare {{.*}} @_ZN1SIdE1gEv()
Bill Wendling2386bb12013-02-27 00:06:04 +000094 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000095 void (*g4)() = &S<double>::g;
96
Bill Wendling2386bb12013-02-27 00:06:04 +000097 // CHECK: declare {{.*}} @_Z1gIA4_cEvv() [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +000098 (void)&g<char[4]>;
99 // CHECK: declare {{.*}} @_Z1gIcEvv()
Bill Wendling2386bb12013-02-27 00:06:04 +0000100 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +0000101 (void)&g<char>;
102
Bill Wendling2386bb12013-02-27 00:06:04 +0000103 // CHECK: declare {{.*}} @_ZN1SIA4_cE1gEv() [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +0000104 (void)&S<char[4]>::g;
105 // CHECK: declare {{.*}} @_ZN1SIcE1gEv()
Bill Wendling2386bb12013-02-27 00:06:04 +0000106 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +0000107 (void)&S<char>::g;
108}
109
110template<typename T> struct Nested {
111 template<bool b, typename U> void f() noexcept(sizeof(T) == sizeof(U));
112};
113
114// CHECK: define {{.*}} @_Z1jv
115void j() {
116 // CHECK: declare {{.*}} @_ZN6NestedIiE1fILb1EcEEvv(
Bill Wendling2386bb12013-02-27 00:06:04 +0000117 // CHECK-NOT: [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +0000118 Nested<int>().f<true, char>();
Bill Wendling2386bb12013-02-27 00:06:04 +0000119 // CHECK: declare {{.*}} @_ZN6NestedIlE1fILb0ElEEvv({{.*}}) [[NUW]]
Richard Smithd3729422012-04-19 00:08:28 +0000120 Nested<long>().f<false, long>();
121}
Bill Wendlingc33fc4c2013-02-20 07:22:19 +0000122
Bill Wendling706469b2013-02-28 22:49:57 +0000123// CHECK: attributes [[NONE]] = { {{.*}} }
124// CHECK: attributes [[NUW]] = { nounwind{{.*}} }