1abea951c34876a5374d0e3678c7989b225c5c895Anders Carlsson// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -fcxx-exceptions -fexceptions | FileCheck %s 28370c58b9295b32bee50443fe3ac43a47a2047e8Anders Carlsson 37d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCalltypedef typeof(sizeof(0)) size_t; 48370c58b9295b32bee50443fe3ac43a47a2047e8Anders Carlsson 57d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall// This just shouldn't crash. 67d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCallnamespace test0 { 77d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall struct allocator { 87d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall allocator(); 97d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall allocator(const allocator&); 107d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall ~allocator(); 117d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall }; 128370c58b9295b32bee50443fe3ac43a47a2047e8Anders Carlsson 137d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void f(); 147d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void g(bool b, bool c) { 157d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall if (b) { 167d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall if (!c) 177d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall throw allocator(); 187d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 197d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return; 207d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 217d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall f(); 227d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 237d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall} 247d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 257d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCallnamespace test1 { 267d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall struct A { A(int); A(int, int); ~A(); void *p; }; 277d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 287d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *a() { 297d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test11aEv() 307d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8) 317d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 327d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 5) 337d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 347d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: call void @_ZdlPv(i8* [[NEW]]) 357d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(5); 367d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 377d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 387d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *b() { 397d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test11bEv() 407d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8) 417d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 427d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[FOO:%.*]] = invoke i32 @_ZN5test13fooEv() 437d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[FOO]]) 447d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 457d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: call void @_ZdlPv(i8* [[NEW]]) 467d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall extern int foo(); 477d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(foo()); 487d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 497d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 507d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall struct B { B(); ~B(); operator int(); int x; }; 517d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall B makeB(); 527d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 537d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *c() { 547d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test11cEv() 557d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ACTIVE:%.*]] = alloca i1 567d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8) 576f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 true, i1* [[ACTIVE]] 587d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 597d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]]) 607d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[T1:%.*]] = getelementptr inbounds [[B]]* [[T0]], i32 0, i32 0 617d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[T2:%.*]] = load i32* [[T1]], align 4 627d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T2]]) 637d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: store i1 false, i1* [[ACTIVE]] 647d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]]) 657d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 667d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]] 677d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: br i1 [[ISACTIVE]] 687d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: call void @_ZdlPv(i8* [[NEW]]) 697d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(B().x); 707d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 717d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 7266b22771fc0a1dba598e50469f2961048e7edd55John McCall // rdar://11904428 7366b22771fc0a1dba598e50469f2961048e7edd55John McCall // Terminate landing pads should call __cxa_begin_catch first. 74899245792776dd219a3c36eb19b42272e270bc0cBill Wendling // CHECK: define linkonce_odr hidden void @__clang_call_terminate(i8*) [[NI_NR_NUW:#[0-9]+]] 754e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: [[T0:%.*]] = call i8* @__cxa_begin_catch(i8* %0) [[NUW:#[0-9]+]] 764e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: call void @_ZSt9terminatev() [[NR_NUW:#[0-9]+]] 7766b22771fc0a1dba598e50469f2961048e7edd55John McCall // CHECK-NEXT: unreachable 7866b22771fc0a1dba598e50469f2961048e7edd55John McCall 797d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *d() { 807d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test11dEv() 817d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ACTIVE:%.*]] = alloca i1 827d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8) 836f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 true, i1* [[ACTIVE]] 847d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 857d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]]) 867d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T0]]) 877d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T1]]) 887d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: store i1 false, i1* [[ACTIVE]] 897d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]]) 907d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 917d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]] 927d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: br i1 [[ISACTIVE]] 937d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: call void @_ZdlPv(i8* [[NEW]]) 947d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(B()); 957d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 967d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 977d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *e() { 987d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test11eEv() 997d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ACTIVE:%.*]] = alloca i1 1007d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8) 1016f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 true, i1* [[ACTIVE]] 1027d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 1037d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11BC1Ev([[B:%.*]]* [[T0:%.*]]) 1047d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T0]]) 1057d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11BC1Ev([[B]]* [[T2:%.*]]) 1067d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[T3:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T2]]) 1077d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11AC1Eii([[A]]* [[CAST]], i32 [[T1]], i32 [[T3]]) 1087d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: store i1 false, i1* [[ACTIVE]] 1097d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test11BD1Ev([[B]]* [[T2]]) 1107d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]]) 1117d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 1127d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]] 1137d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: br i1 [[ISACTIVE]] 1147d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: call void @_ZdlPv(i8* [[NEW]]) 1157d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(B(), B()); 1167d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 1177d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *f() { 1187d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(makeB().x); 1197d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 1207d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *g() { 1217d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(makeB()); 1227d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 1237d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *h() { 1247d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(makeB(), makeB()); 1258370c58b9295b32bee50443fe3ac43a47a2047e8Anders Carlsson } 1267d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 1277d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *i() { 1287d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test11iEv() 1297d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[X:%.*]] = alloca [[A]]*, align 8 1307d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ACTIVE:%.*]] = alloca i1 1316f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK: [[NEW:%.*]] = call noalias i8* @_Znwm(i64 8) 1326f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 true, i1* [[ACTIVE]] 1337d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 1347d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test15makeBEv([[B:%.*]]* sret [[T0:%.*]]) 1357d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[T1:%.*]] = invoke i32 @_ZN5test11BcviEv([[B]]* [[T0]]) 1367d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11AC1Ei([[A]]* [[CAST]], i32 [[T1]]) 1377d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: store i1 false, i1* [[ACTIVE]] 1387d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: store [[A]]* [[CAST]], [[A]]** [[X]], align 8 1397d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test15makeBEv([[B:%.*]]* sret [[T2:%.*]]) 1407d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[RET:%.*]] = load [[A]]** [[X]], align 8 1417d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11BD1Ev([[B]]* [[T2]]) 1427d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test11BD1Ev([[B]]* [[T0]]) 1437d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[RET]] 1447d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[ISACTIVE:%.*]] = load i1* [[ACTIVE]] 1457d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: br i1 [[ISACTIVE]] 1467d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: call void @_ZdlPv(i8* [[NEW]]) 1477d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *x; 1487d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return (x = new A(makeB()), makeB(), x); 1497d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 1507d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall} 1517d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 1527d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCallnamespace test2 { 1537d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall struct A { 1547d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A(int); A(int, int); ~A(); 1557d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void *p; 1567d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void *operator new(size_t); 1577d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void operator delete(void*, size_t); 1587d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall }; 1597d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 1607d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *a() { 1617d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test21aEv() 1627d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[NEW:%.*]] = call i8* @_ZN5test21AnwEm(i64 8) 1637d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 1647d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test21AC1Ei([[A]]* [[CAST]], i32 5) 1657d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 1667d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: invoke void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8) 1674e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK: call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]] 1687d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new A(5); 1697d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 1707d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall} 1717d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 1727d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCallnamespace test3 { 1737d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall struct A { 1743019c444c672938c57f5573840071ecd73425ee7John McCall A(int); A(int, int); A(const A&); ~A(); 1757d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void *p; 1763019c444c672938c57f5573840071ecd73425ee7John McCall void *operator new(size_t, void*, double); 1773019c444c672938c57f5573840071ecd73425ee7John McCall void operator delete(void*, void*, double); 1787d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall }; 1797d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 1803019c444c672938c57f5573840071ecd73425ee7John McCall void *foo(); 1813019c444c672938c57f5573840071ecd73425ee7John McCall double bar(); 1823019c444c672938c57f5573840071ecd73425ee7John McCall A makeA(), *makeAPtr(); 1833019c444c672938c57f5573840071ecd73425ee7John McCall 1847d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *a() { 1857d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test31aEv() 1867d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[FOO:%.*]] = call i8* @_ZN5test33fooEv() 1873019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[BAR:%.*]] = call double @_ZN5test33barEv() 1883019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[BAR]]) 1897d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 1907d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: invoke void @_ZN5test31AC1Ei([[A]]* [[CAST]], i32 5) 1917d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: ret [[A]]* [[CAST]] 1923019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: invoke void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]]) 1934e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK: call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]] 1947d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new(foo(),bar()) A(5); 1957d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 1963019c444c672938c57f5573840071ecd73425ee7John McCall 1973019c444c672938c57f5573840071ecd73425ee7John McCall // rdar://problem/8439196 1983019c444c672938c57f5573840071ecd73425ee7John McCall A *b(bool cond) { 1993019c444c672938c57f5573840071ecd73425ee7John McCall 2003019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: define [[A:%.*]]* @_ZN5test31bEb(i1 zeroext 2013019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[SAVED0:%.*]] = alloca i8* 2023019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: [[SAVED1:%.*]] = alloca i8* 2033019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: [[CLEANUPACTIVE:%.*]] = alloca i1 2043019c444c672938c57f5573840071ecd73425ee7John McCall 2053019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[COND:%.*]] = trunc i8 {{.*}} to i1 2066f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 false, i1* [[CLEANUPACTIVE]] 2073019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: br i1 [[COND]] 2083019c444c672938c57f5573840071ecd73425ee7John McCall return (cond ? 2093019c444c672938c57f5573840071ecd73425ee7John McCall 2103019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[FOO:%.*]] = call i8* @_ZN5test33fooEv() 2113019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[CONST:.*]]) 2123019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: store i8* [[NEW]], i8** [[SAVED0]] 2133019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: store i8* [[FOO]], i8** [[SAVED1]] 2143019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: store i1 true, i1* [[CLEANUPACTIVE]] 2153019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 21622cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK-NEXT: invoke void @_ZN5test35makeAEv([[A]]* sret [[CAST]]) 21722cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK: br label 2183019c444c672938c57f5573840071ecd73425ee7John McCall // -> cond.end 2193019c444c672938c57f5573840071ecd73425ee7John McCall new(foo(),10.0) A(makeA()) : 2203019c444c672938c57f5573840071ecd73425ee7John McCall 22122cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK: [[MAKE:%.*]] = call [[A]]* @_ZN5test38makeAPtrEv() 2223019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: br label 2233019c444c672938c57f5573840071ecd73425ee7John McCall // -> cond.end 2243019c444c672938c57f5573840071ecd73425ee7John McCall makeAPtr()); 2253019c444c672938c57f5573840071ecd73425ee7John McCall 2263019c444c672938c57f5573840071ecd73425ee7John McCall // cond.end: 2273019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[RESULT:%.*]] = phi [[A]]* {{.*}}[[CAST]]{{.*}}[[MAKE]] 2283019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: ret [[A]]* [[RESULT]] 2293019c444c672938c57f5573840071ecd73425ee7John McCall 2303019c444c672938c57f5573840071ecd73425ee7John McCall // in the EH path: 2313019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[ISACTIVE:%.*]] = load i1* [[CLEANUPACTIVE]] 2323019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: br i1 [[ISACTIVE]] 2333019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK: [[V0:%.*]] = load i8** [[SAVED0]] 2343019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: [[V1:%.*]] = load i8** [[SAVED1]] 2353019c444c672938c57f5573840071ecd73425ee7John McCall // CHECK-NEXT: invoke void @_ZN5test31AdlEPvS1_d(i8* [[V0]], i8* [[V1]], double [[CONST]]) 2363019c444c672938c57f5573840071ecd73425ee7John McCall } 2377d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall} 2387d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 2397d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCallnamespace test4 { 2407d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall struct A { 2417d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A(int); A(int, int); ~A(); 2427d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void *p; 2437d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void *operator new(size_t, void*, void*); 2447d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall void operator delete(void*, size_t, void*, void*); // not a match 2457d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall }; 2467d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 2477d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall A *a() { 2487d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: define [[A:%.*]]* @_ZN5test41aEv() 2497d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK: [[FOO:%.*]] = call i8* @_ZN5test43fooEv() 2507d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[BAR:%.*]] = call i8* @_ZN5test43barEv() 2517d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test41AnwEmPvS1_(i64 8, i8* [[FOO]], i8* [[BAR]]) 2527d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]* 2537d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: call void @_ZN5test41AC1Ei([[A]]* [[CAST]], i32 5) 2547d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall // CHECK-NEXT: ret [[A]]* [[CAST]] 2557d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall extern void *foo(), *bar(); 2567d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall 2577d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall return new(foo(),bar()) A(5); 2587d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall } 2598370c58b9295b32bee50443fe3ac43a47a2047e8Anders Carlsson} 260e996ffd240f20a1048179d7727a6ee3227261921John McCall 261e996ffd240f20a1048179d7727a6ee3227261921John McCall// PR7908 262e996ffd240f20a1048179d7727a6ee3227261921John McCallnamespace test5 { 263e996ffd240f20a1048179d7727a6ee3227261921John McCall struct T { T(); ~T(); }; 264e996ffd240f20a1048179d7727a6ee3227261921John McCall 265e996ffd240f20a1048179d7727a6ee3227261921John McCall struct A { 266e996ffd240f20a1048179d7727a6ee3227261921John McCall A(const A &x, const T &t = T()); 267e996ffd240f20a1048179d7727a6ee3227261921John McCall ~A(); 268e996ffd240f20a1048179d7727a6ee3227261921John McCall }; 269e996ffd240f20a1048179d7727a6ee3227261921John McCall 270e996ffd240f20a1048179d7727a6ee3227261921John McCall void foo(); 271e996ffd240f20a1048179d7727a6ee3227261921John McCall 27293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test54testEv() 273e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK: [[EXNSLOT:%.*]] = alloca i8* 27493c332a8ba2c193c435b293966d343dab15f555bJohn McCall // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32 275e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: [[A:%.*]] = alloca [[A_T:%.*]], align 1 276e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: [[T:%.*]] = alloca [[T_T:%.*]], align 1 277e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: invoke void @_ZN5test53fooEv() 278e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK: [[EXN:%.*]] = load i8** [[EXNSLOT]] 279e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: [[ADJ:%.*]] = call i8* @__cxa_get_exception_ptr(i8* [[EXN]]) 280e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: [[SRC:%.*]] = bitcast i8* [[ADJ]] to [[A_T]]* 281e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: invoke void @_ZN5test51TC1Ev([[T_T]]* [[T]]) 282ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK: invoke void @_ZN5test51AC1ERKS0_RKNS_1TE([[A_T]]* [[A]], [[A_T]]* nonnull [[SRC]], [[T_T]]* nonnull [[T]]) 283e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK: invoke void @_ZN5test51TD1Ev([[T_T]]* [[T]]) 2844e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]] 285e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK-NEXT: invoke void @_ZN5test51AD1Ev([[A_T]]* [[A]]) 286e996ffd240f20a1048179d7727a6ee3227261921John McCall // CHECK: call void @__cxa_end_catch() 287e996ffd240f20a1048179d7727a6ee3227261921John McCall void test() { 288e996ffd240f20a1048179d7727a6ee3227261921John McCall try { 289e996ffd240f20a1048179d7727a6ee3227261921John McCall foo(); 290e996ffd240f20a1048179d7727a6ee3227261921John McCall } catch (A a) { 291e996ffd240f20a1048179d7727a6ee3227261921John McCall } 292e996ffd240f20a1048179d7727a6ee3227261921John McCall } 293e996ffd240f20a1048179d7727a6ee3227261921John McCall} 29427f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall 29527f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall// PR9303: invalid assert on this 29627f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCallnamespace test6 { 29727f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall bool cond(); 29827f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall void test() { 29927f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall try { 30027f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall lbl: 30127f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall if (cond()) goto lbl; 30227f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall } catch (...) { 30327f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall } 30427f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall } 30527f8d703e65095ca9c8c5d08a5a835b5510a730dJohn McCall} 306a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall 307a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall// PR9298 308a7f633f522af786e80dc08dbd63e222c9414095bJohn McCallnamespace test7 { 309a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall struct A { A(); ~A(); }; 310a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall struct B { 311a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall // The throw() operator means that a bad allocation is signalled 312a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall // with a null return, which means that the initializer is 313a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall // evaluated conditionally. 314a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall static void *operator new(size_t size) throw(); 315a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall B(const A&, B*); 316a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall ~B(); 317a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall }; 318a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall 319a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall B *test() { 320c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: define [[B:%.*]]* @_ZN5test74testEv() 321c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: [[OUTER_NEW:%.*]] = alloca i1 322c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: alloca [[A:%.*]], 323c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: alloca i8* 324c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: alloca i32 325c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: [[OUTER_A:%.*]] = alloca i1 326c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: alloca i8* 327c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: [[INNER_NEW:%.*]] = alloca i1 328c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: alloca [[A]] 329c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: [[INNER_A:%.*]] = alloca i1 330c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 331c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Allocate the outer object. 332c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test71BnwEm( 333c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: icmp eq i8* [[NEW]], null 334c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 335c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // These stores, emitted before the outermost conditional branch, 336c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // deactivate the temporary cleanups. 3376f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 false, i1* [[OUTER_NEW]] 338c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: store i1 false, i1* [[OUTER_A]] 3396f103ba42cb69d50005a977c5ea583984ab63fc4John McCall // CHECK-NEXT: store i1 false, i1* [[INNER_NEW]] 340c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: store i1 false, i1* [[INNER_A]] 341c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: br i1 342c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 343c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // We passed the first null check; activate that cleanup and continue. 344c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: store i1 true, i1* [[OUTER_NEW]] 345c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: bitcast 346c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 347c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Create the first A temporary and activate that cleanup. 348c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: invoke void @_ZN5test71AC1Ev( 349c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: store i1 true, i1* [[OUTER_A]] 350c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 351c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Allocate the inner object. 352c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test71BnwEm( 353c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: icmp eq i8* [[NEW]], null 354c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: br i1 355c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 356c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // We passed the second null check; save that pointer, activate 357c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // that cleanup, and continue. 358c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: store i8* [[NEW]] 359c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: store i1 true, i1* [[INNER_NEW]] 360c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: bitcast 361c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 362c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Build the second A temporary and activate that cleanup. 363c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: invoke void @_ZN5test71AC1Ev( 364c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: store i1 true, i1* [[INNER_A]] 365c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 366c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Build the inner B object and deactivate the inner delete cleanup. 367c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: invoke void @_ZN5test71BC1ERKNS_1AEPS0_( 368c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: store i1 false, i1* [[INNER_NEW]] 369c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: phi 370c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 371c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Build the outer B object and deactivate the outer delete cleanup. 372c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: invoke void @_ZN5test71BC1ERKNS_1AEPS0_( 373c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: store i1 false, i1* [[OUTER_NEW]] 374c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: phi 3759f357de8d5823f9b13cf33ad1f6af1dd69b7669fJohn McCall // CHECK-NEXT: store [[B]]* 376c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 377c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Destroy the inner A object. 378c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: load i1* [[INNER_A]] 379c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: br i1 380c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: invoke void @_ZN5test71AD1Ev( 381c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 382c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // Destroy the outer A object. 383c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: load i1* [[OUTER_A]] 384c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK-NEXT: br i1 385c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall // CHECK: invoke void @_ZN5test71AD1Ev( 386c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall 387a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall return new B(A(), new B(A(), 0)); 388a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall } 389a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall} 3901366862c3f5d390140b5978380d9ac7317d60fc6John McCall 3911366862c3f5d390140b5978380d9ac7317d60fc6John McCall// Just don't crash. 3921366862c3f5d390140b5978380d9ac7317d60fc6John McCallnamespace test8 { 3931366862c3f5d390140b5978380d9ac7317d60fc6John McCall struct A { 39490b2bdf3b96892ea44e5bf6869a92a08d09a6545John McCall // Having both of these is required to trigger the assert we're 39590b2bdf3b96892ea44e5bf6869a92a08d09a6545John McCall // trying to avoid. 3961366862c3f5d390140b5978380d9ac7317d60fc6John McCall A(const A&); 39790b2bdf3b96892ea44e5bf6869a92a08d09a6545John McCall A&operator=(const A&); 39890b2bdf3b96892ea44e5bf6869a92a08d09a6545John McCall 3991366862c3f5d390140b5978380d9ac7317d60fc6John McCall ~A(); 4001366862c3f5d390140b5978380d9ac7317d60fc6John McCall }; 4011366862c3f5d390140b5978380d9ac7317d60fc6John McCall 4021366862c3f5d390140b5978380d9ac7317d60fc6John McCall A makeA(); 4031366862c3f5d390140b5978380d9ac7317d60fc6John McCall void test() { 4041366862c3f5d390140b5978380d9ac7317d60fc6John McCall throw makeA(); 4051366862c3f5d390140b5978380d9ac7317d60fc6John McCall } 40693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test84testEv 407576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman} 408576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman 409576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman// Make sure we generate the correct code for the delete[] call which 410576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman// happens if A::A() throws. (We were previously calling delete[] on 411576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman// a pointer to the first array element, not the pointer returned by new[].) 412576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman// PR10870 413576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedmannamespace test9 { 414576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman struct A { 415576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman A(); 416576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman ~A(); 417576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman }; 418576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman A* test() { 419576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman return new A[10]; 420576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman } 421576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman // CHECK: define {{%.*}}* @_ZN5test94testEv 422576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman // CHECK: [[TEST9_NEW:%.*]] = call noalias i8* @_Znam 423576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman // CHECK: call void @_ZdaPv(i8* [[TEST9_NEW]]) 4241366862c3f5d390140b5978380d9ac7317d60fc6John McCall} 425f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall 426f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall// In a destructor with a function-try-block, a return statement in a 427f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall// catch handler behaves differently from running off the end of the 428f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall// catch handler. PR13102. 429f5533019fb70d62917fd080f6152b6469e2c6cd5John McCallnamespace test10 { 430f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall extern void cleanup(); 431f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall extern bool suppress; 432f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall 433f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall struct A { ~A(); }; 434f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall A::~A() try { cleanup(); } catch (...) { return; } 43593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test101AD1Ev( 436f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: invoke void @_ZN6test107cleanupEv() 437f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK-NOT: rethrow 438f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: ret void 439f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall 440f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall struct B { ~B(); }; 441f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall B::~B() try { cleanup(); } catch (...) {} 44293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test101BD1Ev( 443f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: invoke void @_ZN6test107cleanupEv() 444f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: call i8* @__cxa_begin_catch 445f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK-NEXT: invoke void @__cxa_rethrow() 446f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: unreachable 447f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall 448f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall struct C { ~C(); }; 449f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall C::~C() try { cleanup(); } catch (...) { if (suppress) return; } 45093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test101CD1Ev( 451f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: invoke void @_ZN6test107cleanupEv() 452f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: call i8* @__cxa_begin_catch 453f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK-NEXT: load i8* @_ZN6test108suppressE, align 1 454f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK-NEXT: trunc 455f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK-NEXT: br i1 456f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: call void @__cxa_end_catch() 457f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK-NEXT: br label 458f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: invoke void @__cxa_rethrow() 459f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall // CHECK: unreachable 460f5533019fb70d62917fd080f6152b6469e2c6cd5John McCall} 461074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall 462074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall// Ensure that an exception in a constructor destroys 463074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall// already-constructed array members. PR14514 464074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCallnamespace test11 { 465074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall struct A { 466074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall A(); 467074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall ~A() {} 468074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall }; 469074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall 470074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall struct C { 471074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall A single; 472074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall A array[2][3]; 473074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall 474074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall C(); 475074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall }; 476074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall 477074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall C::C() { 478074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall throw 0; 479074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall } 48093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test111CC2Ev( 481074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[THIS:%.*]] = load [[C:%.*]]** {{%.*}} 482074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // Construct single. 483074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[C]]* [[THIS]], i32 0, i32 0 484074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: call void @_ZN6test111AC1Ev([[A:%.*]]* [[SINGLE]]) 485074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // Construct array. 486074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[C]]* [[THIS]], i32 0, i32 1 487074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0 488074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]]* [[ARRAYBEGIN]], i64 6 489074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: br label 490074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[ARRAYBEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 491074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: invoke void @_ZN6test111AC1Ev([[A:%.*]]* [[CUR]]) 492074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1 493074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[ARRAYEND]] 494074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: br i1 [[DONE]], 495074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // throw 0; 496074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: invoke void @__cxa_throw( 497074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // Landing pad 1, from constructor in array-initialization loop: 498074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: landingpad 499074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // - First, destroy already-constructed bits of array. 500074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[EMPTY:%.*]] = icmp eq [[A]]* [[ARRAYBEGIN]], [[CUR]] 501074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: br i1 [[EMPTY]] 502074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] 503074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1 504074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* [[ELT]]) 505074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]] 506074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: br i1 [[DONE]], 507074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // - Next, chain to cleanup for single. 508074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: br label 509074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // Landing pad 2, from throw site. 510074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: landingpad 511074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // - First, destroy all of array. 512074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x [[A]]]]* [[ARRAY]], i32 0, i32 0, i32 0 513074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds [[A]]* [[ARRAYBEGIN]], i64 6 514074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: br label 515074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[AFTER:%.*]] = phi [[A]]* [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ] 516074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: [[ELT]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1 517074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: invoke void @_ZN6test111AD1Ev([[A]]* [[ELT]]) 518074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: [[DONE:%.*]] = icmp eq [[A]]* [[ELT]], [[ARRAYBEGIN]] 519074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK-NEXT: br i1 [[DONE]], 520074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // - Next, chain to cleanup for single. 521074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: br label 522074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // Finally, the cleanup for single. 523074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: invoke void @_ZN6test111AD1Ev([[A]]* [[SINGLE]]) 524074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: br label 525074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // CHECK: resume 526074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall // (After this is a terminate landingpad.) 527074cae0861a87bf96d8ea56d02e34839d9ccbd0aJohn McCall} 528f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling 529899245792776dd219a3c36eb19b42272e270bc0cBill Wendling// CHECK: attributes [[NI_NR_NUW]] = { noinline noreturn nounwind } 530