blob: 885158f8a0548fa4d5e80caea21dbd1b6e0c293a [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
76void t9() {
77 bool b;
78
79 new bool(true);
80 new (&b) bool(true);
81}
Fariborz Jahanian048f52a2009-11-24 18:29:37 +000082
83struct A {
84 void* operator new(__typeof(sizeof(int)), int, float, ...);
85 A();
86};
87
88A* t10() {
89 // CHECK: @_ZN1AnwEmifz
90 return new(1, 2, 3.45, 100) A;
91}
92
Anders Carlsson0d7c5832010-05-03 01:20:20 +000093struct B { int a; };
Anders Carlsson30311fa2009-12-16 06:57:54 +000094void t11() {
Nuno Lopesfc284482009-12-16 16:59:22 +000095 // CHECK: call noalias i8* @_Znwm
Mon P Wang3ecd7852010-04-04 03:10:52 +000096 // CHECK: call void @llvm.memset.p0i8.i64(
Anders Carlsson30311fa2009-12-16 06:57:54 +000097 B* b = new B();
98}
Anders Carlssone99bdb62010-05-03 15:09:17 +000099
100struct Empty { };
101
102// We don't need to initialize an empty class.
103void t12() {
104 // CHECK: define void @_Z3t12v
105 // CHECK-NOT: br label
106 // CHECK: ret void
107 (void)new Empty[10];
108}