new.cpp revision 7b86862ff555a9d848ac7abf6042d192b6d5a04d
1// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s 2#include <stddef.h> 3 4void t1() { 5 int* a = new int; 6} 7 8// Placement. 9void* operator new(size_t, void*) throw(); 10 11void t2(int* a) { 12 int* b = new (a) int; 13} 14 15struct S { 16 int a; 17}; 18 19// POD types. 20void t3() { 21 int *a = new int(10); 22 _Complex int* b = new _Complex int(10i); 23 24 S s; 25 s.a = 10; 26 S *sp = new S(s); 27} 28 29// Non-POD 30struct T { 31 T(); 32 int a; 33}; 34 35void t4() { 36 // CHECK: call void @_ZN1TC1Ev 37 T *t = new T; 38} 39 40struct T2 { 41 int a; 42 T2(int, int); 43}; 44 45void t5() { 46 // CHECK: call void @_ZN2T2C1Eii 47 T2 *t2 = new T2(10, 10); 48} 49 50int *t6() { 51 // Null check. 52 return new (0) int(10); 53} 54 55void t7() { 56 new int(); 57} 58 59struct U { 60 ~U(); 61}; 62 63void t8(int n) { 64 new int[10]; 65 new int[n]; 66 67 // Non-POD 68 new T[10]; 69 new T[n]; 70 71 // Cookie required 72 new U[10]; 73 new U[n]; 74} 75 76// noalias 77// CHECK: declare noalias i8* @_Znam 78void *operator new[](size_t); 79 80void t9() { 81 bool b; 82 83 new bool(true); 84 new (&b) bool(true); 85} 86 87struct A { 88 void* operator new(__typeof(sizeof(int)), int, float, ...); 89 A(); 90}; 91 92A* t10() { 93 // CHECK: @_ZN1AnwEmifz 94 return new(1, 2, 3.45, 100) A; 95} 96 97// CHECK: define void @_Z3t11i 98struct B { int a; }; 99struct Bmemptr { int Bmemptr::* memptr; int a; }; 100 101void t11(int n) { 102 // CHECK: call noalias i8* @_Znwm 103 // CHECK: call void @llvm.memset.p0i8.i64( 104 B* b = new B(); 105 106 // CHECK: call noalias i8* @_Znam 107 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 108 B *b2 = new B[n](); 109 110 // CHECK: call noalias i8* @_Znam 111 // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 112 // CHECK: br 113 Bmemptr *b_memptr = new Bmemptr[n](); 114 115 // CHECK: ret void 116} 117 118struct Empty { }; 119 120// We don't need to initialize an empty class. 121// CHECK: define void @_Z3t12v 122void t12() { 123 // CHECK: call noalias i8* @_Znam 124 // CHECK-NOT: br 125 (void)new Empty[10]; 126 127 // CHECK: call noalias i8* @_Znam 128 // CHECK-NOT: br 129 (void)new Empty[10](); 130 131 // CHECK: ret void 132} 133 134// Zero-initialization 135// CHECK: define void @_Z3t13i 136void t13(int n) { 137 // CHECK: call noalias i8* @_Znwm 138 // CHECK: store i32 0, i32* 139 (void)new int(); 140 141 // CHECK: call noalias i8* @_Znam 142 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}} 143 (void)new int[n](); 144 145 // CHECK-NEXT: ret void 146} 147