Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -verify -fexceptions -fcxx-exceptions -triple x86_64-linux-gnu | FileCheck %s |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 2 | |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 3 | void h(); |
| 4 | |
| 5 | template<typename T> void f() noexcept(sizeof(T) == 4) { h(); } |
| 6 | |
| 7 | template<typename T> struct S { |
| 8 | static void f() noexcept(sizeof(T) == 4) { h(); } |
| 9 | }; |
| 10 | |
| 11 | // CHECK: define {{.*}} @_Z1fIsEvv() { |
| 12 | template<> void f<short>() { h(); } |
| 13 | // CHECK: define {{.*}} @_Z1fIA2_sEvv() nounwind { |
| 14 | template<> void f<short[2]>() noexcept { h(); } |
| 15 | |
| 16 | // CHECK: define {{.*}} @_ZN1SIsE1fEv() |
| 17 | // CHECK-NOT: nounwind |
| 18 | template<> void S<short>::f() { h(); } |
| 19 | // CHECK: define {{.*}} @_ZN1SIA2_sE1fEv() nounwind |
| 20 | template<> void S<short[2]>::f() noexcept { h(); } |
| 21 | |
| 22 | // CHECK: define {{.*}} @_Z1fIDsEvv() { |
| 23 | template void f<char16_t>(); |
| 24 | // CHECK: define {{.*}} @_Z1fIA2_DsEvv() nounwind { |
| 25 | template void f<char16_t[2]>(); |
| 26 | |
| 27 | // CHECK: define {{.*}} @_ZN1SIDsE1fEv() |
| 28 | // CHECK-NOT: nounwind |
| 29 | template void S<char16_t>::f(); |
| 30 | // CHECK: define {{.*}} @_ZN1SIA2_DsE1fEv() nounwind |
| 31 | template void S<char16_t[2]>::f(); |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 32 | |
| 33 | void g() { |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 34 | // CHECK: define {{.*}} @_Z1fIiEvv() nounwind { |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 35 | f<int>(); |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 36 | // CHECK: define {{.*}} @_Z1fIA2_iEvv() { |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 37 | f<int[2]>(); |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 38 | |
| 39 | // CHECK: define {{.*}} @_ZN1SIiE1fEv() nounwind |
| 40 | S<int>::f(); |
| 41 | // CHECK: define {{.*}} @_ZN1SIA2_iE1fEv() |
| 42 | // CHECK-NOT: nounwind |
| 43 | S<int[2]>::f(); |
| 44 | |
| 45 | // CHECK: define {{.*}} @_Z1fIfEvv() nounwind { |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 46 | void (*f1)() = &f<float>; |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 47 | // CHECK: define {{.*}} @_Z1fIdEvv() { |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 48 | void (*f2)() = &f<double>; |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 49 | |
| 50 | // CHECK: define {{.*}} @_ZN1SIfE1fEv() nounwind |
| 51 | void (*f3)() = &S<float>::f; |
| 52 | // CHECK: define {{.*}} @_ZN1SIdE1fEv() |
| 53 | // CHECK-NOT: nounwind |
| 54 | void (*f4)() = &S<double>::f; |
| 55 | |
| 56 | // CHECK: define {{.*}} @_Z1fIA4_cEvv() nounwind { |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 57 | (void)&f<char[4]>; |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 58 | // CHECK: define {{.*}} @_Z1fIcEvv() { |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 59 | (void)&f<char>; |
Richard Smith | 87162c2 | 2012-04-17 22:30:01 +0000 | [diff] [blame] | 60 | |
| 61 | // CHECK: define {{.*}} @_ZN1SIA4_cE1fEv() nounwind |
| 62 | (void)&S<char[4]>::f; |
| 63 | // CHECK: define {{.*}} @_ZN1SIcE1fEv() |
| 64 | // CHECK-NOT: nounwind |
| 65 | (void)&S<char>::f; |
Richard Smith | e6975e9 | 2012-04-17 00:58:00 +0000 | [diff] [blame] | 66 | } |