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
5ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Declare an 'operator new' template to tickle a bug in __builtin_operator_new.
6ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate<typename T> void *operator new(size_t, int (*)(T));
7ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
8ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// Ensure that this declaration doesn't cause operator new to lose its
9ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// 'noalias' attribute.
10ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithvoid *operator new[](size_t);
11ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
12ed4e367f8e27d2c700efdaff9412f2bf83ddba00Anders Carlssonvoid t1() {
13ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  delete new int;
14ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  delete [] new int [3];
15ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith}
16ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
17ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: declare noalias i8* @_Znwm(i64) [[ATTR_NOBUILTIN:#[^ ]*]]
18ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: declare void @_ZdlPv(i8*) [[ATTR_NOBUILTIN_NOUNWIND:#[^ ]*]]
19ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: declare noalias i8* @_Znam(i64) [[ATTR_NOBUILTIN]]
20ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: declare void @_ZdaPv(i8*) [[ATTR_NOBUILTIN_NOUNWIND]]
21ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
22ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithnamespace std {
23ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  struct nothrow_t {};
24ed4e367f8e27d2c700efdaff9412f2bf83ddba00Anders Carlsson}
25ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithstd::nothrow_t nothrow;
26d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson
27b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall// Declare the reserved placement operators.
28b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid *operator new(size_t, void*) throw();
29b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid operator delete(void*, void*) throw();
30b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid *operator new[](size_t, void*) throw();
31b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallvoid operator delete[](void*, void*) throw();
32d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson
33ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// Declare the replaceable global allocation operators.
34ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithvoid *operator new(size_t, const std::nothrow_t &) throw();
35ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithvoid *operator new[](size_t, const std::nothrow_t &) throw();
36ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithvoid operator delete(void *, const std::nothrow_t &) throw();
37ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithvoid operator delete[](void *, const std::nothrow_t &) throw();
38ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
39d958389d52170be1c6dee93031d34b13809b786bAnders Carlssonvoid t2(int* a) {
40d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson  int* b = new (a) int;
41d958389d52170be1c6dee93031d34b13809b786bAnders Carlsson}
426d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlsson
43627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlssonstruct S {
44627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson  int a;
45627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson};
46627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson
47d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson// POD types.
486d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlssonvoid t3() {
496d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlsson  int *a = new int(10);
503923e95280210ef877153f0c3dbab12d6ed2ad43Anders Carlsson  _Complex int* b = new _Complex int(10i);
513923e95280210ef877153f0c3dbab12d6ed2ad43Anders Carlsson
52627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson  S s;
53627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson  s.a = 10;
54627a3e573f1d9f0429d62c7ceb742a21cdabfce0Anders Carlsson  S *sp = new S(s);
556d0ffad181215fc4ec0fca37c55eae82df6e0531Anders Carlsson}
56d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson
57d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson// Non-POD
58d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonstruct T {
59d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson  T();
60d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson  int a;
61d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson};
62d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson
63d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonvoid t4() {
64a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  // CHECK: call void @_ZN1TC1Ev
65d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson  T *t = new T;
66d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson}
67d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson
68d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonstruct T2 {
69d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson  int a;
70d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson  T2(int, int);
71d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson};
72d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson
73d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlssonvoid t5() {
74a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  // CHECK: call void @_ZN2T2C1Eii
75d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson  T2 *t2 = new T2(10, 10);
76d3fd6bad1249d3f34d71b73e2333fab0db51cce4Anders Carlsson}
77f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson
78f11085398dc27c0010663c711d4a10113e41d70fAnders Carlssonint *t6() {
79f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson  // Null check.
80f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson  return new (0) int(10);
81f11085398dc27c0010663c711d4a10113e41d70fAnders Carlsson}
82215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlsson
83215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlssonvoid t7() {
84215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlsson  new int();
85215bd208d6eeff397bc4316d046ea8b4633efedfAnders Carlsson}
86a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
876ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlssonstruct U {
886ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson  ~U();
896ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson};
906ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson
91a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlssonvoid t8(int n) {
92a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  new int[10];
93a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  new int[n];
94a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
95a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  // Non-POD
96a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  new T[10];
97a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  new T[n];
986ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson
996ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson  // Cookie required
1006ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson  new U[10];
1016ac5fc49ee70b4e3ce3e242c02c66586f652d7acAnders Carlsson  new U[n];
102a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson}
10309edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson
10409edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlssonvoid t9() {
10509edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson  bool b;
10609edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson
10709edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson  new bool(true);
10809edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson  new (&b) bool(true);
10909edb9c38cc7dc596d97d68ba6d23545c7ad3abdAnders Carlsson}
110048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian
111048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanianstruct A {
112048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian  void* operator new(__typeof(sizeof(int)), int, float, ...);
113048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian  A();
114048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian};
115048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian
116048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz JahanianA* t10() {
117048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian   // CHECK: @_ZN1AnwEmifz
118048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian  return new(1, 2, 3.45, 100) A;
119048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian}
120048f52aa9c9c78538fa369af2fc4b7031a55fa77Fariborz Jahanian
12193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z3t11i
1220d7c583a4b4d0f57c6b69c66fd73babec4ef3799Anders Carlssonstruct B { int a; };
12359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorstruct Bmemptr { int Bmemptr::* memptr; int a; };
12459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
12559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorvoid t11(int n) {
126fc2844846e91398205fddc71196fe9dda04e105fNuno Lopes  // CHECK: call noalias i8* @_Znwm
1273ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang  // CHECK: call void @llvm.memset.p0i8.i64(
12830311fa6b0735b9cb73b01e25bf9652a4b9b0c53Anders Carlsson  B* b = new B();
12959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
13059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call noalias i8* @_Znam
13159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}}
13259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  B *b2 = new B[n]();
13359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
13459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call noalias i8* @_Znam
13559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
13659174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: br
13759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  Bmemptr *b_memptr = new Bmemptr[n]();
13859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
13959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: ret void
14030311fa6b0735b9cb73b01e25bf9652a4b9b0c53Anders Carlsson}
141e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson
142e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlssonstruct Empty { };
143e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson
144e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson// We don't need to initialize an empty class.
14593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z3t12v
146e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlssonvoid t12() {
14759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call noalias i8* @_Znam
14859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK-NOT: br
149e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson  (void)new Empty[10];
15059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
15159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call noalias i8* @_Znam
15259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK-NOT: br
15359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  (void)new Empty[10]();
15459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
15559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: ret void
15659174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor}
15759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
15859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor// Zero-initialization
15993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z3t13i
16059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorvoid t13(int n) {
16159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call noalias i8* @_Znwm
16259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: store i32 0, i32*
16359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  (void)new int();
16459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
16559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: call noalias i8* @_Znam
16659174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}}
16759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  (void)new int[n]();
16859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
16959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  // CHECK-NEXT: ret void
170e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson}
171d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis
172d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidisstruct Alloc{
173e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  int x;
174d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis  void* operator new[](size_t size);
175d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis  void operator delete[](void* p);
176e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  ~Alloc();
177d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis};
178d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis
179d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidisvoid f() {
180e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  // CHECK: call i8* @_ZN5AllocnaEm(i64 808)
181e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  // CHECK: store i64 200
1821e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // CHECK: call void @_ZN5AllocD1Ev(
183d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis  // CHECK: call void @_ZN5AllocdaEPv(i8*
184d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis  delete[] new Alloc[10][20];
185cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor  // CHECK: call noalias i8* @_Znwm
186cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor  // CHECK: call void @_ZdlPv(i8*
187cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor  delete new bool;
188cc09c022bebcabd5f222d410bb6695af0ea93257Douglas Gregor  // CHECK: ret void
189d2932986a16244b7f9a3f9a7a6b0daf543c91540Argyrios Kyrtzidis}
190b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall
191b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCallnamespace test15 {
192b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  struct A { A(); ~A(); };
193b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall
19493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:    define void @_ZN6test155test0EPv(
195b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK:      [[P:%.*]] = load i8*
196b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: icmp eq i8* [[P]], null
197b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: br i1
198b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK:      [[T0:%.*]] = bitcast i8* [[P]] to [[A:%.*]]*
199b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[T0]])
200b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  void test0(void *p) {
201b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    new (p) A();
202b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  }
203b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall
20493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:    define void @_ZN6test155test1EPv(
205c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK:      [[P:%.*]] = load i8**
206b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: icmp eq i8* [[P]], null
207b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: br i1
208c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK:      [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]*
209c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5
210c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: br label
211c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK:      [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
212c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]])
213c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1
214c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]]
215c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: br i1 [[DONE]]
216b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  void test1(void *p) {
217b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    new (p) A[5];
218b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  }
219b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall
220b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // TODO: it's okay if all these size calculations get dropped.
221b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // FIXME: maybe we should try to throw on overflow?
22293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:    define void @_ZN6test155test2EPvi(
223b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK:      [[N:%.*]] = load i32*
224b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: [[T0:%.*]] = sext i32 [[N]] to i64
225b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: [[T1:%.*]] = icmp slt i64 [[T0]], 0
226b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: [[T2:%.*]] = select i1 [[T1]], i64 -1, i64 [[T0]]
227b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: [[P:%.*]] = load i8*
228b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: icmp eq i8* [[P]], null
229b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // CHECK-NEXT: br i1
230c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK:      [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]*
231c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq i64 [[T0]], 0
232c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: br i1 [[ISEMPTY]],
233c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK:      [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 [[T0]]
234c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: br label
235c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK:      [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]],
236c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]])
237b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  void test2(void *p, int n) {
238b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    new (p) A[n];
239b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  }
240b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall}
241d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor
242d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregornamespace PR10197 {
24393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN7PR101971fIiEEvv()
244d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor  template<typename T>
245d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor  void f() {
246d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor    // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm
247d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor    // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to
248d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor    new T;
249d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor    // CHECK-NEXT: ret void
250d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor  }
251d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor
252d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor  template void f<int>();
253d0e8b782787638bcc9c57022e47c28d3529f02d4Douglas Gregor}
25440563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman
25540563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedmannamespace PR11523 {
25640563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman  class MyClass;
25740563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman  typedef int MyClass::* NewTy;
25893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define i64* @_ZN7PR115231fEv
25940563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman  // CHECK: store i64 -1
26040563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman  NewTy* f() { return new NewTy[2](); }
26140563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman}
26222cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman
26322cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedmannamespace PR11757 {
26422cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  // Make sure we elide the copy construction.
26522cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  struct X { X(); X(const X&); };
26622cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  X* a(X* x) { return new X(X()); }
26722cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  // CHECK: define {{.*}} @_ZN7PR117571aEPNS_1XE
26822cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm
26922cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to
27022cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  // CHECK-NEXT: call void @_ZN7PR117571XC1Ev({{.*}}* [[CASTED]])
27122cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman  // CHECK-NEXT: ret {{.*}} [[CASTED]]
27222cfaf512e4f66105fb1f8dd39e0a77787fbdf9bEli Friedman}
273b41ba1aa47a66979df578074de3c218d820c152dEli Friedman
274b41ba1aa47a66979df578074de3c218d820c152dEli Friedmannamespace PR13380 {
275b41ba1aa47a66979df578074de3c218d820c152dEli Friedman  struct A { A() {} };
276b41ba1aa47a66979df578074de3c218d820c152dEli Friedman  struct B : public A { int x; };
27793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define i8* @_ZN7PR133801fEv
278b41ba1aa47a66979df578074de3c218d820c152dEli Friedman  // CHECK: call noalias i8* @_Znam(
279b41ba1aa47a66979df578074de3c218d820c152dEli Friedman  // CHECK: call void @llvm.memset.p0i8
280b41ba1aa47a66979df578074de3c218d820c152dEli Friedman  // CHECK-NEXT: call void @_ZN7PR133801BC1Ev
281b41ba1aa47a66979df578074de3c218d820c152dEli Friedman  void* f() { return new B[2](); }
282b41ba1aa47a66979df578074de3c218d820c152dEli Friedman}
283ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
284ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithstruct MyPlacementType {} mpt;
285ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithvoid *operator new(size_t, MyPlacementType);
286ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
287ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smithnamespace N3664 {
288ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  struct S { S() throw(int); };
289ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-LABEL: define void @_ZN5N36641fEv
291ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  void f() {
292ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call noalias i8* @_Znwm(i64 4) [[ATTR_BUILTIN_NEW:#[^ ]*]]
293ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    int *p = new int;
294ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call void @_ZdlPv({{.*}}) [[ATTR_BUILTIN_DELETE:#[^ ]*]]
295ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    delete p;
296ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
297ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call noalias i8* @_Znam(i64 12) [[ATTR_BUILTIN_NEW]]
298ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    int *q = new int[3];
299ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call void @_ZdaPv({{.*}}) [[ATTR_BUILTIN_DELETE]]
300ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    delete [] p;
301ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
302ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call i8* @_ZnamRKSt9nothrow_t(i64 3, {{.*}}) [[ATTR_BUILTIN_NOTHROW_NEW:#[^ ]*]]
303ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    (void) new (nothrow) S[3];
304ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
305ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call i8* @_Znwm15MyPlacementType(i64 4){{$}}
306ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    (void) new (mpt) int;
307ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  }
308ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
309ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  // FIXME: Can we mark this noalias?
310ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  // CHECK: declare i8* @_ZnamRKSt9nothrow_t(i64, {{.*}}) [[ATTR_NOBUILTIN_NOUNWIND]]
311ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK-LABEL: define void @_ZN5N36641gEv
313ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  void g() {
314ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // It's OK for there to be attributes here, so long as we don't have a
315ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // 'builtin' attribute.
316ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call noalias i8* @_Znwm(i64 4){{$}}
317ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    int *p = (int*)operator new(4);
318ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call void @_ZdlPv({{.*}}) [[ATTR_NOUNWIND:#[^ ]*]]
319ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    operator delete(p);
320ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
321ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call noalias i8* @_Znam(i64 12){{$}}
322ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    int *q = (int*)operator new[](12);
323ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call void @_ZdaPv({{.*}}) [[ATTR_NOUNWIND]]
324ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    operator delete [](p);
325ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
326ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    // CHECK: call i8* @_ZnamRKSt9nothrow_t(i64 3, {{.*}}) [[ATTR_NOUNWIND]]
327ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith    (void) operator new[](3, nothrow);
328ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith  }
329ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith}
330ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
331ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace builtins {
332ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK-LABEL: define void @_ZN8builtins1fEv
333ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  void f() {
334ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK: call noalias i8* @_Znwm(i64 4) [[ATTR_BUILTIN_NEW]]
335ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK: call void @_ZdlPv({{.*}}) [[ATTR_BUILTIN_DELETE]]
336ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    __builtin_operator_delete(__builtin_operator_new(4));
337ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
338ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
339ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
340ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-DAG: attributes [[ATTR_NOBUILTIN]] = {{[{].*}} nobuiltin {{.*[}]}}
341ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-DAG: attributes [[ATTR_NOBUILTIN_NOUNWIND]] = {{[{].*}} nobuiltin nounwind {{.*[}]}}
342ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
343ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: attributes [[ATTR_NOUNWIND]] =
344ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-NOT: builtin
345ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-NOT: attributes
346ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: nounwind
347ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-NOT: builtin
348ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK: attributes
349ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith
350ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-DAG: attributes [[ATTR_BUILTIN_NEW]] = {{[{].*}} builtin {{.*[}]}}
351ddcff1b310b80b63f1a9ba88f2befeab40c3648fRichard Smith// CHECK-DAG: attributes [[ATTR_BUILTIN_DELETE]] = {{[{].*}} builtin {{.*[}]}}
352