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