new.cpp revision cc09c022bebcabd5f222d410bb6695af0ea93257
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
148struct Alloc{
149  int x;
150  void* operator new[](size_t size);
151  void operator delete[](void* p);
152  ~Alloc();
153};
154
155void 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
165}
166