1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -verify -fexceptions -fcxx-exceptions -triple x86_64-linux-gnu | FileCheck %s 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li void h(); 5*67e74705SXin Li f()6*67e74705SXin Litemplate<typename T> void f() noexcept(sizeof(T) == 4) { h(); } 7*67e74705SXin Li template<typename T> void g() noexcept(sizeof(T) == 4); 8*67e74705SXin Li 9*67e74705SXin Li template<typename T> struct S { fS10*67e74705SXin Li static void f() noexcept(sizeof(T) == 4) { h(); } 11*67e74705SXin Li static void g() noexcept(sizeof(T) == 4); 12*67e74705SXin Li }; 13*67e74705SXin Li 14*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIsEvv() [[NONE:#[0-9]+]] { f()15*67e74705SXin Litemplate<> void f<short>() { h(); } 16*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIA2_sEvv() [[NUW:#[0-9]+]] personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { f()17*67e74705SXin Litemplate<> void f<short[2]>() noexcept { h(); } 18*67e74705SXin Li 19*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIsE1fEv() 20*67e74705SXin Li // CHECK-NOT: [[NUW]] f()21*67e74705SXin Litemplate<> void S<short>::f() { h(); } 22*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() [[NUW]] f()23*67e74705SXin Litemplate<> void S<short[2]>::f() noexcept { h(); } 24*67e74705SXin Li 25*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIDsEvv() [[NONE]] comdat { 26*67e74705SXin Li template void f<char16_t>(); 27*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIA2_DsEvv() [[NUW]] comdat personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 28*67e74705SXin Li template void f<char16_t[2]>(); 29*67e74705SXin Li 30*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIDsE1fEv() 31*67e74705SXin Li // CHECK-NOT: [[NUW]] 32*67e74705SXin Li template void S<char16_t>::f(); 33*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIA2_DsE1fEv() [[NUW]] 34*67e74705SXin Li template void S<char16_t[2]>::f(); 35*67e74705SXin Li h()36*67e74705SXin Livoid h() { 37*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIiEvv() [[NUW]] comdat personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 38*67e74705SXin Li f<int>(); 39*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIA2_iEvv() [[NONE]] comdat { 40*67e74705SXin Li f<int[2]>(); 41*67e74705SXin Li 42*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIiE1fEv() [[NUW]] 43*67e74705SXin Li S<int>::f(); 44*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIA2_iE1fEv() 45*67e74705SXin Li // CHECK-NOT: [[NUW]] 46*67e74705SXin Li S<int[2]>::f(); 47*67e74705SXin Li 48*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIfEvv() [[NUW]] comdat personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 49*67e74705SXin Li void (*f1)() = &f<float>; 50*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIdEvv() [[NONE]] comdat { 51*67e74705SXin Li void (*f2)() = &f<double>; 52*67e74705SXin Li 53*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIfE1fEv() [[NUW]] 54*67e74705SXin Li void (*f3)() = &S<float>::f; 55*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIdE1fEv() 56*67e74705SXin Li // CHECK-NOT: [[NUW]] 57*67e74705SXin Li void (*f4)() = &S<double>::f; 58*67e74705SXin Li 59*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIA4_cEvv() [[NUW]] comdat personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 60*67e74705SXin Li (void)&f<char[4]>; 61*67e74705SXin Li // CHECK: define {{.*}} @_Z1fIcEvv() [[NONE]] comdat { 62*67e74705SXin Li (void)&f<char>; 63*67e74705SXin Li 64*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() [[NUW]] 65*67e74705SXin Li (void)&S<char[4]>::f; 66*67e74705SXin Li // CHECK: define {{.*}} @_ZN1SIcE1fEv() 67*67e74705SXin Li // CHECK-NOT: [[NUW]] 68*67e74705SXin Li (void)&S<char>::f; 69*67e74705SXin Li } 70*67e74705SXin Li 71*67e74705SXin Li // CHECK: define {{.*}} @_Z1iv i()72*67e74705SXin Livoid i() { 73*67e74705SXin Li // CHECK: declare {{.*}} @_Z1gIiEvv() [[NUW2:#[0-9]+]] 74*67e74705SXin Li g<int>(); 75*67e74705SXin Li // CHECK: declare {{.*}} @_Z1gIA2_iEvv() 76*67e74705SXin Li // CHECK-NOT: [[NUW]] 77*67e74705SXin Li g<int[2]>(); 78*67e74705SXin Li 79*67e74705SXin Li // CHECK: declare {{.*}} @_ZN1SIiE1gEv() [[NUW2]] 80*67e74705SXin Li S<int>::g(); 81*67e74705SXin Li // CHECK: declare {{.*}} @_ZN1SIA2_iE1gEv() 82*67e74705SXin Li // CHECK-NOT: [[NUW]] 83*67e74705SXin Li S<int[2]>::g(); 84*67e74705SXin Li 85*67e74705SXin Li // CHECK: declare {{.*}} @_Z1gIfEvv() [[NUW2]] 86*67e74705SXin Li void (*g1)() = &g<float>; 87*67e74705SXin Li // CHECK: declare {{.*}} @_Z1gIdEvv() 88*67e74705SXin Li // CHECK-NOT: [[NUW]] 89*67e74705SXin Li void (*g2)() = &g<double>; 90*67e74705SXin Li 91*67e74705SXin Li // CHECK: declare {{.*}} @_ZN1SIfE1gEv() [[NUW2]] 92*67e74705SXin Li void (*g3)() = &S<float>::g; 93*67e74705SXin Li // CHECK: declare {{.*}} @_ZN1SIdE1gEv() 94*67e74705SXin Li // CHECK-NOT: [[NUW]] 95*67e74705SXin Li void (*g4)() = &S<double>::g; 96*67e74705SXin Li 97*67e74705SXin Li // CHECK: declare {{.*}} @_Z1gIA4_cEvv() [[NUW2]] 98*67e74705SXin Li (void)&g<char[4]>; 99*67e74705SXin Li // CHECK: declare {{.*}} @_Z1gIcEvv() 100*67e74705SXin Li // CHECK-NOT: [[NUW]] 101*67e74705SXin Li (void)&g<char>; 102*67e74705SXin Li 103*67e74705SXin Li // CHECK: declare {{.*}} @_ZN1SIA4_cE1gEv() [[NUW2]] 104*67e74705SXin Li (void)&S<char[4]>::g; 105*67e74705SXin Li // CHECK: declare {{.*}} @_ZN1SIcE1gEv() 106*67e74705SXin Li // CHECK-NOT: [[NUW]] 107*67e74705SXin Li (void)&S<char>::g; 108*67e74705SXin Li } 109*67e74705SXin Li 110*67e74705SXin Li template<typename T> struct Nested { 111*67e74705SXin Li template<bool b, typename U> void f() noexcept(sizeof(T) == sizeof(U)); 112*67e74705SXin Li }; 113*67e74705SXin Li 114*67e74705SXin Li // CHECK: define {{.*}} @_Z1jv j()115*67e74705SXin Livoid j() { 116*67e74705SXin Li // CHECK: declare {{.*}} @_ZN6NestedIiE1fILb1EcEEvv( 117*67e74705SXin Li // CHECK-NOT: [[NUW]] 118*67e74705SXin Li Nested<int>().f<true, char>(); 119*67e74705SXin Li // CHECK: declare {{.*}} @_ZN6NestedIlE1fILb0ElEEvv({{.*}}) [[NUW2]] 120*67e74705SXin Li Nested<long>().f<false, long>(); 121*67e74705SXin Li } 122*67e74705SXin Li 123*67e74705SXin Li // CHECK: attributes [[NONE]] = { {{.*}} } 124*67e74705SXin Li // CHECK: attributes [[NUW]] = { nounwind{{.*}} } 125*67e74705SXin Li // CHECK: attributes [[NUW2]] = { nounwind{{.*}} } 126*67e74705SXin Li 127*67e74705SXin Li 128*67e74705SXin Li 129*67e74705SXin Li namespace PR19190 { 130*67e74705SXin Li template <class T> struct DWFIterator { virtual void get() throw(int) = 0; }; foo(DWFIterator<int> * foo)131*67e74705SXin Livoid foo(DWFIterator<int> *foo) { foo->get(); } 132*67e74705SXin Li } 133