Fix the clang-wpa example.
[clang.git] / test / CodeGenCXX / new.cpp
blob10a6f7f4890cea161e0c55e5432d593bdd41e084
1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2 #include <stddef.h>
4 void t1() {
5 int* a = new int;
8 // Placement.
9 void* operator new(size_t, void*) throw();
11 void t2(int* a) {
12 int* b = new (a) int;
15 struct S {
16 int a;
19 // POD types.
20 void t3() {
21 int *a = new int(10);
22 _Complex int* b = new _Complex int(10i);
24 S s;
25 s.a = 10;
26 S *sp = new S(s);
29 // Non-POD
30 struct T {
31 T();
32 int a;
35 void t4() {
36 // CHECK: call void @_ZN1TC1Ev
37 T *t = new T;
40 struct T2 {
41 int a;
42 T2(int, int);
45 void t5() {
46 // CHECK: call void @_ZN2T2C1Eii
47 T2 *t2 = new T2(10, 10);
50 int *t6() {
51 // Null check.
52 return new (0) int(10);
55 void t7() {
56 new int();
59 struct U {
60 ~U();
63 void t8(int n) {
64 new int[10];
65 new int[n];
67 // Non-POD
68 new T[10];
69 new T[n];
71 // Cookie required
72 new U[10];
73 new U[n];
76 // noalias
77 // CHECK: declare noalias i8* @_Znam
78 void *operator new[](size_t);
80 void t9() {
81 bool b;
83 new bool(true);
84 new (&b) bool(true);
87 struct A {
88 void* operator new(__typeof(sizeof(int)), int, float, ...);
89 A();
92 A* t10() {
93 // CHECK: @_ZN1AnwEmifz
94 return new(1, 2, 3.45, 100) A;
97 // CHECK: define void @_Z3t11i
98 struct B { int a; };
99 struct Bmemptr { int Bmemptr::* memptr; int a; };
101 void t11(int n) {
102 // CHECK: call noalias i8* @_Znwm
103 // CHECK: call void @llvm.memset.p0i8.i64(
104 B* b = new B();
106 // CHECK: call noalias i8* @_Znam
107 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}}
108 B *b2 = new B[n]();
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]();
115 // CHECK: ret void
118 struct Empty { };
120 // We don't need to initialize an empty class.
121 // CHECK: define void @_Z3t12v
122 void t12() {
123 // CHECK: call noalias i8* @_Znam
124 // CHECK-NOT: br
125 (void)new Empty[10];
127 // CHECK: call noalias i8* @_Znam
128 // CHECK-NOT: br
129 (void)new Empty[10]();
131 // CHECK: ret void
134 // Zero-initialization
135 // CHECK: define void @_Z3t13i
136 void t13(int n) {
137 // CHECK: call noalias i8* @_Znwm
138 // CHECK: store i32 0, i32*
139 (void)new int();
141 // CHECK: call noalias i8* @_Znam
142 // CHECK: {{call void.*llvm.memset.p0i8.i64.*i8 0, i64 %}}
143 (void)new int[n]();
145 // CHECK-NEXT: ret void
148 struct Alloc{
149 int x;
150 void* operator new[](size_t size);
151 void operator delete[](void* p);
152 ~Alloc();
155 void f() {
156 // CHECK: call i8* @_ZN5AllocnaEm(i64 808)
157 // CHECK: store i64 200
158 // CHECK: call void @_ZN5AllocD1Ev(
159 // CHECK: call void @_ZN5AllocdaEPv(i8*
160 delete[] new Alloc[10][20];
161 // CHECK: call noalias i8* @_Znwm
162 // CHECK: call void @_ZdlPv(i8*
163 delete new bool;
164 // CHECK: ret void