blob: 10a6f7f4890cea161e0c55e5432d593bdd41e084 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s
Daniel Dunbar010c3f52009-11-12 00:41:41 +00002#include <stddef.h>
Anders Carlssoned4e3672009-05-31 20:21:44 +00003
4void t1() {
5 int* a = new int;
6}
Anders Carlssond9583892009-05-31 20:26:12 +00007
8// Placement.
Daniel Dunbar010c3f52009-11-12 00:41:41 +00009void* operator new(size_t, void*) throw();
Anders Carlssond9583892009-05-31 20:26:12 +000010
11void t2(int* a) {
12 int* b = new (a) int;
13}
Anders Carlsson6d0ffad2009-05-31 20:56:36 +000014
Anders Carlsson627a3e52009-05-31 21:12:26 +000015struct S {
16 int a;
17};
18
Anders Carlssond3fd6ba2009-05-31 21:53:59 +000019// POD types.
Anders Carlsson6d0ffad2009-05-31 20:56:36 +000020void t3() {
21 int *a = new int(10);
Anders Carlsson3923e952009-05-31 21:07:58 +000022 _Complex int* b = new _Complex int(10i);
23
Anders Carlsson627a3e52009-05-31 21:12:26 +000024 S s;
25 s.a = 10;
26 S *sp = new S(s);
Anders Carlsson6d0ffad2009-05-31 20:56:36 +000027}
Anders Carlssond3fd6ba2009-05-31 21:53:59 +000028
29// Non-POD
30struct T {
31 T();
32 int a;
33};
34
35void t4() {
Anders Carlssona4d4c012009-09-23 16:07:23 +000036 // CHECK: call void @_ZN1TC1Ev
Anders Carlssond3fd6ba2009-05-31 21:53:59 +000037 T *t = new T;
38}
39
40struct T2 {
41 int a;
42 T2(int, int);
43};
44
45void t5() {
Anders Carlssona4d4c012009-09-23 16:07:23 +000046 // CHECK: call void @_ZN2T2C1Eii
Anders Carlssond3fd6ba2009-05-31 21:53:59 +000047 T2 *t2 = new T2(10, 10);
48}
Anders Carlssonf1108532009-06-01 00:05:16 +000049
50int *t6() {
51 // Null check.
52 return new (0) int(10);
53}
Anders Carlsson215bd202009-06-01 00:26:14 +000054
55void t7() {
56 new int();
57}
Anders Carlssona4d4c012009-09-23 16:07:23 +000058
Anders Carlsson6ac5fc42009-09-23 18:59:48 +000059struct U {
60 ~U();
61};
62
Anders Carlssona4d4c012009-09-23 16:07:23 +000063void t8(int n) {
64 new int[10];
65 new int[n];
66
67 // Non-POD
68 new T[10];
69 new T[n];
Anders Carlsson6ac5fc42009-09-23 18:59:48 +000070
71 // Cookie required
72 new U[10];
73 new U[n];
Anders Carlssona4d4c012009-09-23 16:07:23 +000074}
Anders Carlsson09edb9c2009-11-22 19:25:33 +000075
Douglas Gregor7b868622010-08-18 15:06:25 +000076// noalias
77// CHECK: declare noalias i8* @_Znam
78void *operator new[](size_t);
79
Anders Carlsson09edb9c2009-11-22 19:25:33 +000080void t9() {
81 bool b;
82
83 new bool(true);
84 new (&b) bool(true);
85}
Fariborz Jahanian048f52a2009-11-24 18:29:37 +000086
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
Douglas Gregor59174c02010-07-21 01:10:17 +000097// CHECK: define void @_Z3t11i
Anders Carlsson0d7c5832010-05-03 01:20:20 +000098struct B { int a; };
Douglas Gregor59174c02010-07-21 01:10:17 +000099struct Bmemptr { int Bmemptr::* memptr; int a; };
100
101void t11(int n) {
Nuno Lopesfc284482009-12-16 16:59:22 +0000102 // CHECK: call noalias i8* @_Znwm
Mon P Wang3ecd7852010-04-04 03:10:52 +0000103 // CHECK: call void @llvm.memset.p0i8.i64(
Anders Carlsson30311fa2009-12-16 06:57:54 +0000104 B* b = new B();
Douglas Gregor59174c02010-07-21 01:10:17 +0000105
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
Anders Carlsson30311fa2009-12-16 06:57:54 +0000116}
Anders Carlssone99bdb62010-05-03 15:09:17 +0000117
118struct Empty { };
119
120// We don't need to initialize an empty class.
Douglas Gregor59174c02010-07-21 01:10:17 +0000121// CHECK: define void @_Z3t12v
Anders Carlssone99bdb62010-05-03 15:09:17 +0000122void t12() {
Douglas Gregor59174c02010-07-21 01:10:17 +0000123 // CHECK: call noalias i8* @_Znam
124 // CHECK-NOT: br
Anders Carlssone99bdb62010-05-03 15:09:17 +0000125 (void)new Empty[10];
Douglas Gregor59174c02010-07-21 01:10:17 +0000126
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
Anders Carlssone99bdb62010-05-03 15:09:17 +0000146}
Argyrios Kyrtzidisd2932982010-08-25 23:14:56 +0000147
148struct Alloc{
Argyrios Kyrtzidise7ab92e2010-08-26 15:23:38 +0000149 int x;
Argyrios Kyrtzidisd2932982010-08-25 23:14:56 +0000150 void* operator new[](size_t size);
151 void operator delete[](void* p);
Argyrios Kyrtzidise7ab92e2010-08-26 15:23:38 +0000152 ~Alloc();
Argyrios Kyrtzidisd2932982010-08-25 23:14:56 +0000153};
154
155void f() {
Argyrios Kyrtzidise7ab92e2010-08-26 15:23:38 +0000156 // CHECK: call i8* @_ZN5AllocnaEm(i64 808)
157 // CHECK: store i64 200
John McCall1e7fe752010-09-02 09:58:18 +0000158 // CHECK: call void @_ZN5AllocD1Ev(
Argyrios Kyrtzidisd2932982010-08-25 23:14:56 +0000159 // CHECK: call void @_ZN5AllocdaEPv(i8*
160 delete[] new Alloc[10][20];
Douglas Gregorcc09c022010-09-02 23:24:14 +0000161 // CHECK: call noalias i8* @_Znwm
162 // CHECK: call void @_ZdlPv(i8*
163 delete new bool;
164 // CHECK: ret void
Argyrios Kyrtzidisd2932982010-08-25 23:14:56 +0000165}