blob: fed39761714ef18a2c25b1a1e2622346bc6cf87b [file] [log] [blame]
Stephen Hines0e2c34f2015-03-23 12:09:02 -07001// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 -mconstructor-aliases -fcxx-exceptions -fexceptions -fno-rtti -DTRY | FileCheck %s -check-prefix=TRY
2// RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 -mconstructor-aliases -fcxx-exceptions -fexceptions -fno-rtti -DTHROW | FileCheck %s -check-prefix=THROW
Stephen Hines6bcf27b2014-05-29 04:14:42 -07003
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -07004// THROW-DAG: @"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { i8** @"\01??_7type_info@@6B@", i8* null, [3 x i8] c".H\00" }, comdat
5// THROW-DAG: @"_CT??_R0H@84" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 1, i8* bitcast (%rtti.TypeDescriptor2* @"\01??_R0H@8" to i8*), i32 0, i32 -1, i32 0, i32 4, i8* null }, section ".xdata", comdat
6// THROW-DAG: @_CTA1H = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.1 { i32 1, [1 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0H@84"] }, section ".xdata", comdat
7// THROW-DAG: @_TI1H = linkonce_odr unnamed_addr constant %eh.ThrowInfo { i32 0, i8* null, i8* null, i8* bitcast (%eh.CatchableTypeArray.1* @_CTA1H to i8*) }, section ".xdata", comdat
8
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -07009// TRY-DAG: @llvm.eh.handlertype.PAH.1 = private unnamed_addr constant %eh.CatchHandlerType { i32 1, i8* bitcast (%rtti.TypeDescriptor4* @"\01??_R0PAH@8" to i8*) }, section "llvm.metadata"
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070010
Stephen Hines6bcf27b2014-05-29 04:14:42 -070011void external();
12
13inline void not_emitted() {
14 throw int(13); // no error
15}
16
17int main() {
18 int rv = 0;
19#ifdef TRY
Stephen Hines0e2c34f2015-03-23 12:09:02 -070020 try {
21 external(); // TRY: invoke void @"\01?external@@YAXXZ"
Stephen Hines6bcf27b2014-05-29 04:14:42 -070022 } catch (int) {
23 rv = 1;
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -070024 // TRY: call void @llvm.eh.begincatch(i8* %{{.*}}, i8* null)
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070025 // TRY: call void @llvm.eh.endcatch()
Stephen Hines6bcf27b2014-05-29 04:14:42 -070026 }
27#endif
28#ifdef THROW
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070029 // THROW: store i32 42, i32* %[[mem_for_throw:.*]]
30 // THROW: %[[cast:.*]] = bitcast i32* %[[mem_for_throw]] to i8*
31 // THROW: call void @_CxxThrowException(i8* %[[cast]], %eh.ThrowInfo* @_TI1H)
Stephen Hines0e2c34f2015-03-23 12:09:02 -070032 throw int(42);
Stephen Hines6bcf27b2014-05-29 04:14:42 -070033#endif
34 return rv;
35}
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070036
37#ifdef TRY
38// TRY-LABEL: define void @"\01?qual_catch@@YAXXZ"
39void qual_catch() {
40 try {
41 external();
42 } catch (const int *) {
43 }
Pirama Arumuga Nainar33337ca2015-05-06 11:48:57 -070044 // TRY: catch %eh.CatchHandlerType* @llvm.eh.handlertype.PAH.1
45 // TRY: call i32 @llvm.eh.typeid.for(i8* bitcast (%eh.CatchHandlerType* @llvm.eh.handlertype.PAH.1 to i8*))
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070046}
47#endif