David Majnemer | ba3e5ec | 2015-03-13 18:26:17 +0000 | [diff] [blame^] | 1 | // RUN: %clang_cc1 -emit-llvm -o - -triple=i386-pc-win32 -std=c++11 %s -fcxx-exceptions -fms-extensions | FileCheck %s |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 2 | |
| 3 | // CHECK-DAG: @"\01??_R0?AUY@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUY@@\00" }, comdat |
David Majnemer | 322fe41 | 2015-03-06 23:45:23 +0000 | [diff] [blame] | 4 | // CHECK-DAG: @"_CT??_R0?AUY@@@8??0Y@@QAE@ABU0@@Z8" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 4, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUY@@@8" to i8*), i32 0, i32 -1, i32 0, i32 8, i8* bitcast (%struct.Y* (%struct.Y*, %struct.Y*, i32)* @"\01??0Y@@QAE@ABU0@@Z" to i8*) }, section ".xdata", comdat |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 5 | // CHECK-DAG: @"\01??_R0?AUZ@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUZ@@\00" }, comdat |
David Majnemer | 322fe41 | 2015-03-06 23:45:23 +0000 | [diff] [blame] | 6 | // CHECK-DAG: @"_CT??_R0?AUZ@@@81" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUZ@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* null }, section ".xdata", comdat |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 7 | // CHECK-DAG: @"\01??_R0?AUW@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUW@@\00" }, comdat |
David Majnemer | 999cbf9 | 2015-03-10 19:01:51 +0000 | [diff] [blame] | 8 | // CHECK-DAG: @"_CT??_R0?AUW@@@8??0W@@QAE@ABU0@@Z44" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 4, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUW@@@8" to i8*), i32 4, i32 -1, i32 0, i32 4, i8* bitcast (%struct.W* (%struct.W*, %struct.W*, i32)* @"\01??0W@@QAE@ABU0@@Z" to i8*) }, section ".xdata", comdat |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 9 | // CHECK-DAG: @"\01??_R0?AUM@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUM@@\00" }, comdat |
David Majnemer | 999cbf9 | 2015-03-10 19:01:51 +0000 | [diff] [blame] | 10 | // CHECK-DAG: @"_CT??_R0?AUM@@@818" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUM@@@8" to i8*), i32 8, i32 -1, i32 0, i32 1, i8* null }, section ".xdata", comdat |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 11 | // CHECK-DAG: @"\01??_R0?AUV@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUV@@\00" }, comdat |
David Majnemer | 999cbf9 | 2015-03-10 19:01:51 +0000 | [diff] [blame] | 12 | // CHECK-DAG: @"_CT??_R0?AUV@@@81044" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUV@@@8" to i8*), i32 0, i32 4, i32 4, i32 1, i8* null }, section ".xdata", comdat |
| 13 | // CHECK-DAG: @"_CTA5?AUY@@" = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.5 { i32 5, [5 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0?AUY@@@8??0Y@@QAE@ABU0@@Z8", %eh.CatchableType* @"_CT??_R0?AUZ@@@81", %eh.CatchableType* @"_CT??_R0?AUW@@@8??0W@@QAE@ABU0@@Z44", %eh.CatchableType* @"_CT??_R0?AUM@@@818", %eh.CatchableType* @"_CT??_R0?AUV@@@81044"] }, section ".xdata", comdat |
David Majnemer | 322fe41 | 2015-03-06 23:45:23 +0000 | [diff] [blame] | 14 | // CHECK-DAG: @"_TI5?AUY@@" = linkonce_odr unnamed_addr constant %eh.ThrowInfo { i32 0, i8* bitcast (void (%struct.Y*)* @"\01??_DY@@QAE@XZ" to i8*), i8* null, i8* bitcast (%eh.CatchableTypeArray.5* @"_CTA5?AUY@@" to i8*) }, section ".xdata", comdat |
David Majnemer | dfa6d20 | 2015-03-11 18:36:39 +0000 | [diff] [blame] | 15 | // CHECK-DAG: @"_CT??_R0?AUDefault@@@8??_ODefault@@QAEXAAU0@@Z1" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor13* @"\01??_R0?AUDefault@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* bitcast (void (%struct.Default*, %struct.Default*)* @"\01??_ODefault@@QAEXAAU0@@Z" to i8*) }, section ".xdata", comdat |
| 16 | // CHECK-DAG: @"_CT??_R0?AUVariadic@@@8??_OVariadic@@QAEXAAU0@@Z1" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor14* @"\01??_R0?AUVariadic@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* bitcast (void (%struct.Variadic*, %struct.Variadic*)* @"\01??_OVariadic@@QAEXAAU0@@Z" to i8*) }, section ".xdata", comdat |
| 17 | // CHECK-DAG: @"_CT??_R0?AUTemplateWithDefault@@@8??$?_OH@TemplateWithDefault@@QAEXAAU0@@Z1" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor25* @"\01??_R0?AUTemplateWithDefault@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* bitcast (void (%struct.TemplateWithDefault*, %struct.TemplateWithDefault*)* @"\01??$?_OH@TemplateWithDefault@@QAEXAAU0@@Z" to i8*) }, section ".xdata", comdat |
David Majnemer | a1aea9a | 2015-03-12 17:44:49 +0000 | [diff] [blame] | 18 | // CHECK-DAG: @"_CTA2$$T" = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.2 { i32 2, [2 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0$$T@84", %eh.CatchableType* @"_CT??_R0PAX@84"] }, section ".xdata", comdat |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 19 | |
| 20 | |
| 21 | struct N { ~N(); }; |
| 22 | struct M : private N {}; |
| 23 | struct X {}; |
| 24 | struct Z {}; |
| 25 | struct V : private X {}; |
| 26 | struct W : M, virtual V {}; |
| 27 | struct Y : Z, W, virtual V {}; |
| 28 | |
| 29 | void f(const Y &y) { |
| 30 | // CHECK-LABEL: @"\01?f@@YAXABUY@@@Z" |
| 31 | // CHECK: call x86_thiscallcc %struct.Y* @"\01??0Y@@QAE@ABU0@@Z"(%struct.Y* %[[mem:.*]], %struct.Y* |
| 32 | // CHECK: %[[cast:.*]] = bitcast %struct.Y* %[[mem]] to i8* |
David Majnemer | d3d7669 | 2015-03-06 23:45:20 +0000 | [diff] [blame] | 33 | // CHECK: call void @_CxxThrowException(i8* %[[cast]], %eh.ThrowInfo* @"_TI5?AUY@@") |
| 34 | throw y; |
| 35 | } |
| 36 | |
| 37 | void g(const int *const *y) { |
| 38 | // CHECK-LABEL: @"\01?g@@YAXPBQBH@Z" |
| 39 | // CHECK: call void @_CxxThrowException(i8* %{{.*}}, %eh.ThrowInfo* @_TIC2PAPBH) |
David Majnemer | 7c23707 | 2015-03-05 00:46:22 +0000 | [diff] [blame] | 40 | throw y; |
| 41 | } |
David Majnemer | dfa6d20 | 2015-03-11 18:36:39 +0000 | [diff] [blame] | 42 | |
| 43 | struct Default { |
| 44 | Default(Default &, int = 42); |
| 45 | }; |
| 46 | |
| 47 | // CHECK-LABEL: @"\01??_ODefault@@QAEXAAU0@@Z" |
| 48 | // CHECK: %[[src_addr:.*]] = alloca |
| 49 | // CHECK: %[[this_addr:.*]] = alloca |
| 50 | // CHECK: store {{.*}} %src, {{.*}} %[[src_addr]], align 4 |
| 51 | // CHECK: store {{.*}} %this, {{.*}} %[[this_addr]], align 4 |
| 52 | // CHECK: %[[this:.*]] = load {{.*}} %[[this_addr]] |
| 53 | // CHECK: %[[src:.*]] = load {{.*}} %[[src_addr]] |
| 54 | // CHECK: call x86_thiscallcc {{.*}} @"\01??0Default@@QAE@AAU0@H@Z"({{.*}} %[[this]], {{.*}} %[[src]], i32 42) |
| 55 | // CHECK: ret void |
| 56 | |
| 57 | void h(Default &d) { |
| 58 | throw d; |
| 59 | } |
| 60 | |
| 61 | struct Variadic { |
| 62 | Variadic(Variadic &, ...); |
| 63 | }; |
| 64 | |
| 65 | void i(Variadic &v) { |
| 66 | throw v; |
| 67 | } |
| 68 | |
| 69 | // CHECK-LABEL: @"\01??_OVariadic@@QAEXAAU0@@Z" |
| 70 | // CHECK: %[[src_addr:.*]] = alloca |
| 71 | // CHECK: %[[this_addr:.*]] = alloca |
| 72 | // CHECK: store {{.*}} %src, {{.*}} %[[src_addr:.*]], align |
| 73 | // CHECK: store {{.*}} %this, {{.*}} %[[this_addr:.*]], align |
| 74 | // CHECK: %[[this:.*]] = load {{.*}} %[[this_addr]] |
| 75 | // CHECK: %[[src:.*]] = load {{.*}} %[[src_addr]] |
David Majnemer | 6787329 | 2015-03-11 21:50:09 +0000 | [diff] [blame] | 76 | // CHECK: call {{.*}} @"\01??0Variadic@@QAA@AAU0@ZZ"({{.*}} %[[this]], {{.*}} %[[src]]) |
David Majnemer | dfa6d20 | 2015-03-11 18:36:39 +0000 | [diff] [blame] | 77 | // CHECK: ret void |
| 78 | |
| 79 | struct TemplateWithDefault { |
| 80 | template <typename T> |
| 81 | static int f() { |
| 82 | return 0; |
| 83 | } |
| 84 | template <typename T = int> |
| 85 | TemplateWithDefault(TemplateWithDefault &, T = f<T>()); |
| 86 | }; |
| 87 | |
| 88 | void j(TemplateWithDefault &twd) { |
| 89 | throw twd; |
| 90 | } |
David Majnemer | a1aea9a | 2015-03-12 17:44:49 +0000 | [diff] [blame] | 91 | |
David Majnemer | ba3e5ec | 2015-03-13 18:26:17 +0000 | [diff] [blame^] | 92 | |
David Majnemer | a1aea9a | 2015-03-12 17:44:49 +0000 | [diff] [blame] | 93 | void h() { |
| 94 | throw nullptr; |
| 95 | } |
David Majnemer | ba3e5ec | 2015-03-13 18:26:17 +0000 | [diff] [blame^] | 96 | |
| 97 | namespace std { |
| 98 | template <typename T> |
| 99 | void *__GetExceptionInfo(T); |
| 100 | } |
| 101 | |
| 102 | void *GetExceptionInfo_test0() { |
| 103 | // CHECK-LABEL: @"\01?GetExceptionInfo_test0@@YAPAXXZ" |
| 104 | // CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1H to i8*) |
| 105 | return std::__GetExceptionInfo(0); |
| 106 | } |