blob: 60c1661e0602e01b415a2631ec1fd1e775c6f931 [file] [log] [blame]
Anders Carlssonfe404562010-02-02 03:23:38 +00001// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin10 | FileCheck %s
Anders Carlsson1884eb02010-05-22 17:35:42 +00002// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin10 -O3 | FileCheck --check-prefix=CHECK-O3 %s
Anders Carlsson45147d02010-02-02 03:37:46 +00003struct A { int a; int b; };
Eli Friedman9b372742009-11-27 04:56:40 +00004struct B { int b; };
5struct C : B, A { };
6
Anders Carlsson63b071f2010-02-02 03:32:35 +00007// Zero init.
8namespace ZeroInit {
9 // CHECK: @_ZN8ZeroInit1aE = global i64 -1
10 int A::* a;
11
12 // CHECK: @_ZN8ZeroInit2aaE = global [2 x i64] [i64 -1, i64 -1]
13 int A::* aa[2];
14
15 // CHECK: @_ZN8ZeroInit3aaaE = global [2 x [2 x i64]] {{\[}}[2 x i64] [i64 -1, i64 -1], [2 x i64] [i64 -1, i64 -1]]
16 int A::* aaa[2][2];
17
18 // CHECK: @_ZN8ZeroInit1bE = global i64 -1,
19 int A::* b = 0;
Anders Carlsson2c12d032010-02-02 05:17:25 +000020
21 // CHECK: @_ZN8ZeroInit2saE = global %struct.anon { i64 -1 }
22 struct {
23 int A::*a;
24 } sa;
25
Anders Carlsson7e673c42010-02-05 06:58:06 +000026 // CHECK: @_ZN8ZeroInit3ssaE =
27 // CHECK: [2 x i64] [i64 -1, i64 -1]
Anders Carlsson2c12d032010-02-02 05:17:25 +000028 struct {
29 int A::*aa[2];
30 } ssa[2];
31
32 // CHECK: @_ZN8ZeroInit2ssE = global %1 { %struct.anon { i64 -1 } }
33 struct {
34 struct {
35 int A::*pa;
36 } s;
37 } ss;
Anders Carlssona83fb4b2010-05-18 16:51:41 +000038
39 struct A {
40 int A::*a;
41 int b;
42 };
43
44 struct B {
45 A a[10];
46 char c;
47 int B::*b;
48 };
49
50 struct C : A, B { int j; };
51 // CHECK: @_ZN8ZeroInit1cE = global %"struct.ZeroInit::C" { [16 x i8] c"\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00", [176 x i8] c"\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF", i32 0, [4 x i8] zeroinitializer }
52 C c;
Anders Carlsson45147d02010-02-02 03:37:46 +000053}
Anders Carlsson63b071f2010-02-02 03:32:35 +000054
Anders Carlsson45147d02010-02-02 03:37:46 +000055// PR5674
56namespace PR5674 {
57 // CHECK: @_ZN6PR56742pbE = global i64 4
58 int A::*pb = &A::b;
Anders Carlsson63b071f2010-02-02 03:32:35 +000059}
60
Anders Carlssonfe404562010-02-02 03:23:38 +000061// Casts.
62namespace Casts {
63
Eli Friedman9b372742009-11-27 04:56:40 +000064int A::*pa;
65int C::*pc;
66
67void f() {
John McCall0bab0cd2010-08-23 01:21:21 +000068 // CHECK: store i64 -1, i64* @_ZN5Casts2paE
Eli Friedman9b372742009-11-27 04:56:40 +000069 pa = 0;
70
John McCall0bab0cd2010-08-23 01:21:21 +000071 // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2paE, align 8
72 // CHECK-NEXT: [[ADJ:%.*]] = add nsw i64 [[TMP]], 4
73 // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
74 // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
75 // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2pcE
Eli Friedman9b372742009-11-27 04:56:40 +000076 pc = pa;
77
John McCall0bab0cd2010-08-23 01:21:21 +000078 // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2pcE, align 8
79 // CHECK-NEXT: [[ADJ:%.*]] = sub nsw i64 [[TMP]], 4
80 // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
81 // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
82 // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2paE
Eli Friedman9b372742009-11-27 04:56:40 +000083 pa = static_cast<int A::*>(pc);
84}
Anders Carlssonfe404562010-02-02 03:23:38 +000085
86}
Anders Carlsson45147d02010-02-02 03:37:46 +000087
88// Comparisons
89namespace Comparisons {
90 void f() {
91 int A::*a;
92
93 // CHECK: icmp ne i64 {{.*}}, -1
94 if (a) { }
95
96 // CHECK: icmp ne i64 {{.*}}, -1
97 if (a != 0) { }
98
99 // CHECK: icmp ne i64 -1, {{.*}}
100 if (0 != a) { }
101
102 // CHECK: icmp eq i64 {{.*}}, -1
103 if (a == 0) { }
104
105 // CHECK: icmp eq i64 -1, {{.*}}
106 if (0 == a) { }
107 }
108}
Anders Carlsson3cb18bc2010-05-14 15:05:19 +0000109
110namespace ValueInit {
111
112struct A {
113 int A::*a;
114
115 char c;
116
117 A();
118};
119
120// CHECK: define void @_ZN9ValueInit1AC2Ev
121// CHECK: store i64 -1, i64*
122// CHECK: ret void
123A::A() : a() {}
124
125}
Anders Carlssona83fb4b2010-05-18 16:51:41 +0000126
Anders Carlsson1884eb02010-05-22 17:35:42 +0000127namespace PR7139 {
128
129struct pair {
130 int first;
131 int second;
132};
133
134typedef int pair::*ptr_to_member_type;
135
136struct ptr_to_member_struct {
137 ptr_to_member_type data;
138 int i;
139};
140
141struct A {
142 ptr_to_member_struct a;
143
144 A() : a() {}
145};
146
147// CHECK-O3: define zeroext i1 @_ZN6PR71395checkEv() nounwind readnone
148bool check() {
149 // CHECK-O3: ret i1 true
150 return A().a.data == 0;
151}
152
Anders Carlssona40a9f32010-05-22 17:45:10 +0000153// CHECK-O3: define zeroext i1 @_ZN6PR71396check2Ev() nounwind readnone
154bool check2() {
155 // CHECK-O3: ret i1 true
156 return ptr_to_member_type() == 0;
157}
158
Anders Carlsson1884eb02010-05-22 17:35:42 +0000159}
Anders Carlsson0a87b372010-05-27 18:51:01 +0000160
161namespace VirtualBases {
162
163struct A {
164 char c;
165 int A::*i;
166};
167
168// FIXME: A::i should be initialized to -1 here.
169struct B : virtual A { };
170B b;
171
172// FIXME: A::i should be initialized to -1 here.
173struct C : virtual A { int A::*i; };
174C c;
175
176// FIXME: C::A::i should be initialized to -1 here.
177struct D : C { int A::*i; };
178D d;
179
180}
Anders Carlssone9a05b72010-06-03 15:36:07 +0000181
182namespace Test1 {
183
184// Don't crash when A contains a bit-field.
185struct A {
186 int A::* a;
187 int b : 10;
188};
189A a;
190
191}