1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2 3 typedef __typeof__(sizeof(0)) size_t; 4 5 void t1() { 6 int* a = new int; 7 } 8 9 // Declare the reserved placement operators. 10 void *operator new(size_t, void*) throw(); 11 void operator delete(void*, void*) throw(); 12 void *operator new[](size_t, void*) throw(); 13 void operator delete[](void*, void*) throw(); 14 15 void t2(int* a) { 16 int* b = new (a) int; 17 } 18 19 struct S { 20 int a; 21 }; 22 23 // POD types. 24 void t3() { 25 int *a = new int(10); 26 _Complex int* b = new _Complex int(10i); 27 28 S s; 29 s.a = 10; 30 S *sp = new S(s); 31 } 32 33 // Non-POD 34 struct T { 35 T(); 36 int a; 37 }; 38 39 void t4() { 40 // CHECK: call void @_ZN1TC1Ev 41 T *t = new T; 42 } 43 44 struct T2 { 45 int a; 46 T2(int, int); 47 }; 48 49 void t5() { 50 // CHECK: call void @_ZN2T2C1Eii 51 T2 *t2 = new T2(10, 10); 52 } 53 54 int *t6() { 55 // Null check. 56 return new (0) int(10); 57 } 58 59 void t7() { 60 new int(); 61 } 62 63 struct U { 64 ~U(); 65 }; 66 67 void t8(int n) { 68 new int[10]; 69 new int[n]; 70 71 // Non-POD 72 new T[10]; 73 new T[n]; 74 75 // Cookie required 76 new U[10]; 77 new U[n]; 78 } 79 80 // noalias 81 // CHECK: declare noalias i8* @_Znam 82 void *operator new[](size_t); 83 84 void t9() { 85 bool b; 86 87 new bool(true); 88 new (&b) bool(true); 89 } 90 91 struct A { 92 void* operator new(__typeof(sizeof(int)), int, float, ...); 93 A(); 94 }; 95 96 A* t10() { 97 // CHECK: @_ZN1AnwEmifz 98 return new(1, 2, 3.45, 100) A; 99 } 100 101 // CHECK: define void @_Z3t11i 102 struct B { int a; }; 103 struct Bmemptr { int Bmemptr::* memptr; int a; }; 104 105 void t11(int n) { 106 // CHECK: call noalias i8* @_Znwm 107 // CHECK: call void @llvm.memset.p0i8.i64( 108 B* b = new B(); 109 110 // CHECK: call noalias i8* @_Znam 111 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 112 B *b2 = new B[n](); 113 114 // CHECK: call noalias i8* @_Znam 115 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 116 // CHECK: br 117 Bmemptr *b_memptr = new Bmemptr[n](); 118 119 // CHECK: ret void 120 } 121 122 struct Empty { }; 123 124 // We don't need to initialize an empty class. 125 // CHECK: define void @_Z3t12v 126 void t12() { 127 // CHECK: call noalias i8* @_Znam 128 // CHECK-NOT: br 129 (void)new Empty[10]; 130 131 // CHECK: call noalias i8* @_Znam 132 // CHECK-NOT: br 133 (void)new Empty[10](); 134 135 // CHECK: ret void 136 } 137 138 // Zero-initialization 139 // CHECK: define void @_Z3t13i 140 void t13(int n) { 141 // CHECK: call noalias i8* @_Znwm 142 // CHECK: store i32 0, i32* 143 (void)new int(); 144 145 // CHECK: call noalias i8* @_Znam 146 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 147 (void)new int[n](); 148 149 // CHECK-NEXT: ret void 150 } 151 152 struct Alloc{ 153 int x; 154 void* operator new[](size_t size); 155 void operator delete[](void* p); 156 ~Alloc(); 157 }; 158 159 void f() { 160 // CHECK: call i8* @_ZN5AllocnaEm(i64 808) 161 // CHECK: store i64 200 162 // CHECK: call void @_ZN5AllocD1Ev( 163 // CHECK: call void @_ZN5AllocdaEPv(i8* 164 delete[] new Alloc[10][20]; 165 // CHECK: call noalias i8* @_Znwm 166 // CHECK: call void @_ZdlPv(i8* 167 delete new bool; 168 // CHECK: ret void 169 } 170 171 namespace test15 { 172 struct A { A(); ~A(); }; 173 174 // CHECK: define void @_ZN6test155test0EPv( 175 // CHECK: [[P:%.*]] = load i8* 176 // CHECK-NEXT: icmp eq i8* [[P]], null 177 // CHECK-NEXT: br i1 178 // CHECK: [[T0:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 179 // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[T0]]) 180 void test0(void *p) { 181 new (p) A(); 182 } 183 184 // CHECK: define void @_ZN6test155test1EPv( 185 // CHECK: [[P:%.*]] = load i8** 186 // CHECK-NEXT: icmp eq i8* [[P]], null 187 // CHECK-NEXT: br i1 188 // CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 189 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5 190 // CHECK-NEXT: br label 191 // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 192 // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]]) 193 // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1 194 // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]] 195 // CHECK-NEXT: br i1 [[DONE]] 196 void test1(void *p) { 197 new (p) A[5]; 198 } 199 200 // TODO: it's okay if all these size calculations get dropped. 201 // FIXME: maybe we should try to throw on overflow? 202 // CHECK: define void @_ZN6test155test2EPvi( 203 // CHECK: [[N:%.*]] = load i32* 204 // CHECK-NEXT: [[T0:%.*]] = sext i32 [[N]] to i64 205 // CHECK-NEXT: [[T1:%.*]] = icmp slt i64 [[T0]], 0 206 // CHECK-NEXT: [[T2:%.*]] = select i1 [[T1]], i64 -1, i64 [[T0]] 207 // CHECK-NEXT: [[P:%.*]] = load i8* 208 // CHECK-NEXT: icmp eq i8* [[P]], null 209 // CHECK-NEXT: br i1 210 // CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 211 // CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq i64 [[T0]], 0 212 // CHECK-NEXT: br i1 [[ISEMPTY]], 213 // CHECK: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 [[T0]] 214 // CHECK-NEXT: br label 215 // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], 216 // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]]) 217 void test2(void *p, int n) { 218 new (p) A[n]; 219 } 220 } 221 222 namespace PR10197 { 223 // CHECK: define weak_odr void @_ZN7PR101971fIiEEvv() 224 template<typename T> 225 void f() { 226 // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm 227 // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to 228 new T; 229 // CHECK-NEXT: ret void 230 } 231 232 template void f<int>(); 233 } 234 235 namespace PR11523 { 236 class MyClass; 237 typedef int MyClass::* NewTy; 238 // CHECK: define i64* @_ZN7PR115231fEv 239 // CHECK: store i64 -1 240 NewTy* f() { return new NewTy[2](); } 241 } 242 243 namespace PR11757 { 244 // Make sure we elide the copy construction. 245 struct X { X(); X(const X&); }; 246 X* a(X* x) { return new X(X()); } 247 // CHECK: define {{.*}} @_ZN7PR117571aEPNS_1XE 248 // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm 249 // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to 250 // CHECK-NEXT: call void @_ZN7PR117571XC1Ev({{.*}}* [[CASTED]]) 251 // CHECK-NEXT: ret {{.*}} [[CASTED]] 252 } 253