1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall 3b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCalltypedef __typeof__(sizeof(0)) size_t; 4ed4e367f8e27d2c700efdaff9412f2bf83ddba00Anders Carlsson 5ed4e367f8e27d2c700efdaff9412f2bf83ddba00Anders Carlssonvoid t1() { 6ed4e367f8e27d2c700efdaff9412f2bf83ddba00Anders Carlsson int* a = new int; 7ed4e367f8e27d2c700efdaff9412f2bf83ddba00Anders Carlsson} 8d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson 9b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall// Declare the reserved placement operators. 10b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid *operator new(size_t, void*) throw(); 11b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid operator delete(void*, void*) throw(); 12b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid *operator new[](size_t, void*) throw(); 13b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid operator delete[](void*, void*) throw(); 14d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson 15d958389d52170be1c6dee93031d34b13809b786bAnders Carlssonvoid t2(int* a) { 16d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson int* b = new (a) int; 17d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson} 186d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlsson 19627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlssonstruct S { 20627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson int a; 21627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson}; 22627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson 23d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson// POD types. 246d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlssonvoid t3() { 256d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlsson int *a = new int(10); 263923e95280210ef877153f0c3dbab12d6ed2ad43Anders Carlsson _Complex int* b = new _Complex int(10i); 273923e95280210ef877153f0c3dbab12d6ed2ad43Anders Carlsson 28627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson S s; 29627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson s.a = 10; 30627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson S *sp = new S(s); 316d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlsson} 32d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson 33d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson// Non-POD 34d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonstruct T { 35d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson T(); 36d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson int a; 37d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson}; 38d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson 39d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonvoid t4() { 40a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson // CHECK: call void @_ZN1TC1Ev 41d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson T *t = new T; 42d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson} 43d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson 44d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonstruct T2 { 45d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson int a; 46d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson T2(int, int); 47d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson}; 48d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson 49d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonvoid t5() { 50a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson // CHECK: call void @_ZN2T2C1Eii 51d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson T2 *t2 = new T2(10, 10); 52d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson} 53f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson 54f11085398dc27c0010663c711d4a10113e41d70fAnders Carlssonint *t6() { 55f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson // Null check. 56f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson return new (0) int(10); 57f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson} 58215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlsson 59215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlssonvoid t7() { 60215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlsson new int(); 61215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlsson} 62a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson 636ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlssonstruct U { 646ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson ~U(); 656ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson}; 666ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson 67a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlssonvoid t8(int n) { 68a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson new int[10]; 69a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson new int[n]; 70a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson 71a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson // Non-POD 72a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson new T[10]; 73a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson new T[n]; 746ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson 756ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson // Cookie required 766ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson new U[10]; 776ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson new U[n]; 78a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson} 7909edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson 807b86862ff555a9d848ac7abf6042d192b6d5a04dDouglas Gregor// noalias 817b86862ff555a9d848ac7abf6042d192b6d5a04dDouglas Gregor// CHECK: declare noalias i8* @_Znam 827b86862ff555a9d848ac7abf6042d192b6d5a04dDouglas Gregorvoid *operator new[](size_t); 837b86862ff555a9d848ac7abf6042d192b6d5a04dDouglas Gregor 8409edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlssonvoid t9() { 8509edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson bool b; 8609edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson 8709edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson new bool(true); 8809edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson new (&b) bool(true); 8909edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson} 90048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian 91048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanianstruct A { 92048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian void* operator new(__typeof(sizeof(int)), int, float, ...); 93048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian A(); 94048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian}; 95048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian 96048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz JahanianA* t10() { 97048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian // CHECK: @_ZN1AnwEmifz 98048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian return new(1, 2, 3.45, 100) A; 99048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian} 100048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian 10159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor// CHECK: define void @_Z3t11i 1020d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlssonstruct B { int a; }; 10359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorstruct Bmemptr { int Bmemptr::* memptr; int a; }; 10459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 10559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorvoid t11(int n) { 106fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes // CHECK: call noalias i8* @_Znwm 1073ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang // CHECK: call void @llvm.memset.p0i8.i64( 10830311fa6b0735b9cb73b01e25bf9652a4b9b0c53Anders Carlsson B* b = new B(); 10959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 11059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call noalias i8* @_Znam 11159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 11259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor B *b2 = new B[n](); 11359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 11459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call noalias i8* @_Znam 11559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 11659174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: br 11759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor Bmemptr *b_memptr = new Bmemptr[n](); 11859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 11959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: ret void 12030311fa6b0735b9cb73b01e25bf9652a4b9b0c53Anders Carlsson} 121e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson 122e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlssonstruct Empty { }; 123e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson 124e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson// We don't need to initialize an empty class. 12559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor// CHECK: define void @_Z3t12v 126e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlssonvoid t12() { 12759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call noalias i8* @_Znam 12859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK-NOT: br 129e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson (void)new Empty[10]; 13059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 13159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call noalias i8* @_Znam 13259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK-NOT: br 13359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor (void)new Empty[10](); 13459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 13559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: ret void 13659174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor} 13759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 13859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor// Zero-initialization 13959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor// CHECK: define void @_Z3t13i 14059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorvoid t13(int n) { 14159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call noalias i8* @_Znwm 14259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: store i32 0, i32* 14359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor (void)new int(); 14459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 14559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: call noalias i8* @_Znam 14659174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 14759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor (void)new int[n](); 14859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor 14959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor // CHECK-NEXT: ret void 150e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson} 151d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis 152d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidisstruct Alloc{ 153e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis int x; 154d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis void* operator new[](size_t size); 155d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis void operator delete[](void* p); 156e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis ~Alloc(); 157d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis}; 158d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis 159d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidisvoid f() { 160e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis // CHECK: call i8* @_ZN5AllocnaEm(i64 808) 161e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis // CHECK: store i64 200 1621e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall // CHECK: call void @_ZN5AllocD1Ev( 163d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis // CHECK: call void @_ZN5AllocdaEPv(i8* 164d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis delete[] new Alloc[10][20]; 165cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor // CHECK: call noalias i8* @_Znwm 166cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor // CHECK: call void @_ZdlPv(i8* 167cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor delete new bool; 168cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor // CHECK: ret void 169d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis} 170b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall 171b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallnamespace test15 { 172b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall struct A { A(); ~A(); }; 173b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall 174b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK: define void @_ZN6test155test0EPv( 175b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK: [[P:%.*]] = load i8* 176b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: icmp eq i8* [[P]], null 177b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: br i1 178b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK: [[T0:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 179b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[T0]]) 180b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall void test0(void *p) { 181b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall new (p) A(); 182b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall } 183b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall 184b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK: define void @_ZN6test155test1EPv( 185c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[P:%.*]] = load i8** 186b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: icmp eq i8* [[P]], null 187b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: br i1 188c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 189c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5 190c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: br label 191c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 192c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]]) 193c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1 194c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]] 195c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: br i1 [[DONE]] 196b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall void test1(void *p) { 197b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall new (p) A[5]; 198b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall } 199b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall 200b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // TODO: it's okay if all these size calculations get dropped. 201b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // FIXME: maybe we should try to throw on overflow? 202b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK: define void @_ZN6test155test2EPvi( 203b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK: [[N:%.*]] = load i32* 204b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: [[T0:%.*]] = sext i32 [[N]] to i64 205b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: [[T1:%.*]] = icmp slt i64 [[T0]], 0 206b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: [[T2:%.*]] = select i1 [[T1]], i64 -1, i64 [[T0]] 207b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: [[P:%.*]] = load i8* 208b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: icmp eq i8* [[P]], null 209b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall // CHECK-NEXT: br i1 210c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 211c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq i64 [[T0]], 0 212c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: br i1 [[ISEMPTY]], 213c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 [[T0]] 214c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: br label 215c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], 216c3c0766277cd64bf117450a1519c9cf762d994d4John McCall // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]]) 217b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall void test2(void *p, int n) { 218b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall new (p) A[n]; 219b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall } 220b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall} 221d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor 222d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregornamespace PR10197 { 223d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor // CHECK: define weak_odr void @_ZN7PR101971fIiEEvv() 224d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor template<typename T> 225d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor void f() { 226d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm 227d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to 228d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor new T; 229d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor // CHECK-NEXT: ret void 230d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor } 231d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor 232d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor template void f<int>(); 233d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor} 23440563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman 23540563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedmannamespace PR11523 { 23640563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman class MyClass; 23740563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman typedef int MyClass::* NewTy; 23840563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman // CHECK: define i64* @_ZN7PR115231fEv 23940563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman // CHECK: store i64 -1 24040563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman NewTy* f() { return new NewTy[2](); } 24140563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman} 24222cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman 24322cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedmannamespace PR11757 { 24422cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // Make sure we elide the copy construction. 24522cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman struct X { X(); X(const X&); }; 24622cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman X* a(X* x) { return new X(X()); } 24722cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK: define {{.*}} @_ZN7PR117571aEPNS_1XE 24822cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm 24922cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to 25022cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK-NEXT: call void @_ZN7PR117571XC1Ev({{.*}}* [[CASTED]]) 25122cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman // CHECK-NEXT: ret {{.*}} [[CASTED]] 25222cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman} 253