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 // Declare an 'operator new' template to tickle a bug in __builtin_operator_new. 6 template<typename T> void *operator new(size_t, int (*)(T)); 7 8 // Ensure that this declaration doesn't cause operator new to lose its 9 // 'noalias' attribute. 10 void *operator new[](size_t); 11 12 void t1() { 13 delete new int; 14 delete [] new int [3]; 15 } 16 17 // CHECK: declare noalias i8* @_Znwm(i64) [[ATTR_NOBUILTIN:#[^ ]*]] 18 // CHECK: declare void @_ZdlPv(i8*) [[ATTR_NOBUILTIN_NOUNWIND:#[^ ]*]] 19 // CHECK: declare noalias i8* @_Znam(i64) [[ATTR_NOBUILTIN]] 20 // CHECK: declare void @_ZdaPv(i8*) [[ATTR_NOBUILTIN_NOUNWIND]] 21 22 namespace std { 23 struct nothrow_t {}; 24 } 25 std::nothrow_t nothrow; 26 27 // Declare the reserved placement operators. 28 void *operator new(size_t, void*) throw(); 29 void operator delete(void*, void*) throw(); 30 void *operator new[](size_t, void*) throw(); 31 void operator delete[](void*, void*) throw(); 32 33 // Declare the replaceable global allocation operators. 34 void *operator new(size_t, const std::nothrow_t &) throw(); 35 void *operator new[](size_t, const std::nothrow_t &) throw(); 36 void operator delete(void *, const std::nothrow_t &) throw(); 37 void operator delete[](void *, const std::nothrow_t &) throw(); 38 39 void t2(int* a) { 40 int* b = new (a) int; 41 } 42 43 struct S { 44 int a; 45 }; 46 47 // POD types. 48 void t3() { 49 int *a = new int(10); 50 _Complex int* b = new _Complex int(10i); 51 52 S s; 53 s.a = 10; 54 S *sp = new S(s); 55 } 56 57 // Non-POD 58 struct T { 59 T(); 60 int a; 61 }; 62 63 void t4() { 64 // CHECK: call void @_ZN1TC1Ev 65 T *t = new T; 66 } 67 68 struct T2 { 69 int a; 70 T2(int, int); 71 }; 72 73 void t5() { 74 // CHECK: call void @_ZN2T2C1Eii 75 T2 *t2 = new T2(10, 10); 76 } 77 78 int *t6() { 79 // Null check. 80 return new (0) int(10); 81 } 82 83 void t7() { 84 new int(); 85 } 86 87 struct U { 88 ~U(); 89 }; 90 91 void t8(int n) { 92 new int[10]; 93 new int[n]; 94 95 // Non-POD 96 new T[10]; 97 new T[n]; 98 99 // Cookie required 100 new U[10]; 101 new U[n]; 102 } 103 104 void t9() { 105 bool b; 106 107 new bool(true); 108 new (&b) bool(true); 109 } 110 111 struct A { 112 void* operator new(__typeof(sizeof(int)), int, float, ...); 113 A(); 114 }; 115 116 A* t10() { 117 // CHECK: @_ZN1AnwEmifz 118 return new(1, 2, 3.45, 100) A; 119 } 120 121 // CHECK-LABEL: define void @_Z3t11i 122 struct B { int a; }; 123 struct Bmemptr { int Bmemptr::* memptr; int a; }; 124 125 void t11(int n) { 126 // CHECK: call noalias i8* @_Znwm 127 // CHECK: call void @llvm.memset.p0i8.i64( 128 B* b = new B(); 129 130 // CHECK: call noalias i8* @_Znam 131 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 132 B *b2 = new B[n](); 133 134 // CHECK: call noalias i8* @_Znam 135 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 136 // CHECK: br 137 Bmemptr *b_memptr = new Bmemptr[n](); 138 139 // CHECK: ret void 140 } 141 142 struct Empty { }; 143 144 // We don't need to initialize an empty class. 145 // CHECK-LABEL: define void @_Z3t12v 146 void t12() { 147 // CHECK: call noalias i8* @_Znam 148 // CHECK-NOT: br 149 (void)new Empty[10]; 150 151 // CHECK: call noalias i8* @_Znam 152 // CHECK-NOT: br 153 (void)new Empty[10](); 154 155 // CHECK: ret void 156 } 157 158 // Zero-initialization 159 // CHECK-LABEL: define void @_Z3t13i 160 void t13(int n) { 161 // CHECK: call noalias i8* @_Znwm 162 // CHECK: store i32 0, i32* 163 (void)new int(); 164 165 // CHECK: call noalias i8* @_Znam 166 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 167 (void)new int[n](); 168 169 // CHECK-NEXT: ret void 170 } 171 172 struct Alloc{ 173 int x; 174 void* operator new[](size_t size); 175 void operator delete[](void* p); 176 ~Alloc(); 177 }; 178 179 void f() { 180 // CHECK: call i8* @_ZN5AllocnaEm(i64 808) 181 // CHECK: store i64 200 182 // CHECK: call void @_ZN5AllocD1Ev( 183 // CHECK: call void @_ZN5AllocdaEPv(i8* 184 delete[] new Alloc[10][20]; 185 // CHECK: call noalias i8* @_Znwm 186 // CHECK: call void @_ZdlPv(i8* 187 delete new bool; 188 // CHECK: ret void 189 } 190 191 namespace test15 { 192 struct A { A(); ~A(); }; 193 194 // CHECK-LABEL: define void @_ZN6test155test0EPv( 195 // CHECK: [[P:%.*]] = load i8* 196 // CHECK-NEXT: icmp eq i8* [[P]], null 197 // CHECK-NEXT: br i1 198 // CHECK: [[T0:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 199 // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[T0]]) 200 void test0(void *p) { 201 new (p) A(); 202 } 203 204 // CHECK-LABEL: define void @_ZN6test155test1EPv( 205 // CHECK: [[P:%.*]] = load i8** 206 // CHECK-NEXT: icmp eq i8* [[P]], null 207 // CHECK-NEXT: br i1 208 // CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 209 // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 5 210 // CHECK-NEXT: br label 211 // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] 212 // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]]) 213 // CHECK-NEXT: [[NEXT]] = getelementptr inbounds [[A]]* [[CUR]], i64 1 214 // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]] 215 // CHECK-NEXT: br i1 [[DONE]] 216 void test1(void *p) { 217 new (p) A[5]; 218 } 219 220 // TODO: it's okay if all these size calculations get dropped. 221 // FIXME: maybe we should try to throw on overflow? 222 // CHECK-LABEL: define void @_ZN6test155test2EPvi( 223 // CHECK: [[N:%.*]] = load i32* 224 // CHECK-NEXT: [[T0:%.*]] = sext i32 [[N]] to i64 225 // CHECK-NEXT: [[T1:%.*]] = icmp slt i64 [[T0]], 0 226 // CHECK-NEXT: [[T2:%.*]] = select i1 [[T1]], i64 -1, i64 [[T0]] 227 // CHECK-NEXT: [[P:%.*]] = load i8* 228 // CHECK-NEXT: icmp eq i8* [[P]], null 229 // CHECK-NEXT: br i1 230 // CHECK: [[BEGIN:%.*]] = bitcast i8* [[P]] to [[A:%.*]]* 231 // CHECK-NEXT: [[ISEMPTY:%.*]] = icmp eq i64 [[T0]], 0 232 // CHECK-NEXT: br i1 [[ISEMPTY]], 233 // CHECK: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 [[T0]] 234 // CHECK-NEXT: br label 235 // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], 236 // CHECK-NEXT: call void @_ZN6test151AC1Ev([[A]]* [[CUR]]) 237 void test2(void *p, int n) { 238 new (p) A[n]; 239 } 240 } 241 242 namespace PR10197 { 243 // CHECK-LABEL: define weak_odr void @_ZN7PR101971fIiEEvv() 244 template<typename T> 245 void f() { 246 // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm 247 // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to 248 new T; 249 // CHECK-NEXT: ret void 250 } 251 252 template void f<int>(); 253 } 254 255 namespace PR11523 { 256 class MyClass; 257 typedef int MyClass::* NewTy; 258 // CHECK-LABEL: define i64* @_ZN7PR115231fEv 259 // CHECK: store i64 -1 260 NewTy* f() { return new NewTy[2](); } 261 } 262 263 namespace PR11757 { 264 // Make sure we elide the copy construction. 265 struct X { X(); X(const X&); }; 266 X* a(X* x) { return new X(X()); } 267 // CHECK: define {{.*}} @_ZN7PR117571aEPNS_1XE 268 // CHECK: [[CALL:%.*]] = call noalias i8* @_Znwm 269 // CHECK-NEXT: [[CASTED:%.*]] = bitcast i8* [[CALL]] to 270 // CHECK-NEXT: call void @_ZN7PR117571XC1Ev({{.*}}* [[CASTED]]) 271 // CHECK-NEXT: ret {{.*}} [[CASTED]] 272 } 273 274 namespace PR13380 { 275 struct A { A() {} }; 276 struct B : public A { int x; }; 277 // CHECK-LABEL: define i8* @_ZN7PR133801fEv 278 // CHECK: call noalias i8* @_Znam( 279 // CHECK: call void @llvm.memset.p0i8 280 // CHECK-NEXT: call void @_ZN7PR133801BC1Ev 281 void* f() { return new B[2](); } 282 } 283 284 struct MyPlacementType {} mpt; 285 void *operator new(size_t, MyPlacementType); 286 287 namespace N3664 { 288 struct S { S() throw(int); }; 289 290 // CHECK-LABEL: define void @_ZN5N36641fEv 291 void f() { 292 // CHECK: call noalias i8* @_Znwm(i64 4) [[ATTR_BUILTIN_NEW:#[^ ]*]] 293 int *p = new int; 294 // CHECK: call void @_ZdlPv({{.*}}) [[ATTR_BUILTIN_DELETE:#[^ ]*]] 295 delete p; 296 297 // CHECK: call noalias i8* @_Znam(i64 12) [[ATTR_BUILTIN_NEW]] 298 int *q = new int[3]; 299 // CHECK: call void @_ZdaPv({{.*}}) [[ATTR_BUILTIN_DELETE]] 300 delete [] p; 301 302 // CHECK: call i8* @_ZnamRKSt9nothrow_t(i64 3, {{.*}}) [[ATTR_BUILTIN_NOTHROW_NEW:#[^ ]*]] 303 (void) new (nothrow) S[3]; 304 305 // CHECK: call i8* @_Znwm15MyPlacementType(i64 4){{$}} 306 (void) new (mpt) int; 307 } 308 309 // FIXME: Can we mark this noalias? 310 // CHECK: declare i8* @_ZnamRKSt9nothrow_t(i64, {{.*}}) [[ATTR_NOBUILTIN_NOUNWIND]] 311 312 // CHECK-LABEL: define void @_ZN5N36641gEv 313 void g() { 314 // It's OK for there to be attributes here, so long as we don't have a 315 // 'builtin' attribute. 316 // CHECK: call noalias i8* @_Znwm(i64 4){{$}} 317 int *p = (int*)operator new(4); 318 // CHECK: call void @_ZdlPv({{.*}}) [[ATTR_NOUNWIND:#[^ ]*]] 319 operator delete(p); 320 321 // CHECK: call noalias i8* @_Znam(i64 12){{$}} 322 int *q = (int*)operator new[](12); 323 // CHECK: call void @_ZdaPv({{.*}}) [[ATTR_NOUNWIND]] 324 operator delete [](p); 325 326 // CHECK: call i8* @_ZnamRKSt9nothrow_t(i64 3, {{.*}}) [[ATTR_NOUNWIND]] 327 (void) operator new[](3, nothrow); 328 } 329 } 330 331 namespace builtins { 332 // CHECK-LABEL: define void @_ZN8builtins1fEv 333 void f() { 334 // CHECK: call noalias i8* @_Znwm(i64 4) [[ATTR_BUILTIN_NEW]] 335 // CHECK: call void @_ZdlPv({{.*}}) [[ATTR_BUILTIN_DELETE]] 336 __builtin_operator_delete(__builtin_operator_new(4)); 337 } 338 } 339 340 // CHECK-DAG: attributes [[ATTR_NOBUILTIN]] = {{[{].*}} nobuiltin {{.*[}]}} 341 // CHECK-DAG: attributes [[ATTR_NOBUILTIN_NOUNWIND]] = {{[{].*}} nobuiltin nounwind {{.*[}]}} 342 343 // CHECK: attributes [[ATTR_NOUNWIND]] = 344 // CHECK-NOT: builtin 345 // CHECK-NOT: attributes 346 // CHECK: nounwind 347 // CHECK-NOT: builtin 348 // CHECK: attributes 349 350 // CHECK-DAG: attributes [[ATTR_BUILTIN_NEW]] = {{[{].*}} builtin {{.*[}]}} 351 // CHECK-DAG: attributes [[ATTR_BUILTIN_DELETE]] = {{[{].*}} builtin {{.*[}]}} 352