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