pointers-to-data-members.cpp revision a40a9f31218c743e366322e34b59f0d4d4414198
1// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin10 | FileCheck %s
2// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin10 -O3 | FileCheck --check-prefix=CHECK-O3 %s
3struct A { int a; int b; };
4struct B { int b; };
5struct C : B, A { };
6
7// 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;
20
21  // CHECK: @_ZN8ZeroInit2saE = global %struct.anon { i64 -1 }
22  struct {
23    int A::*a;
24  } sa;
25
26  // CHECK: @_ZN8ZeroInit3ssaE =
27  // CHECK: [2 x i64] [i64 -1, i64 -1]
28  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;
38
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;
53}
54
55// PR5674
56namespace PR5674 {
57  // CHECK: @_ZN6PR56742pbE = global i64 4
58  int A::*pb = &A::b;
59}
60
61// Casts.
62namespace Casts {
63
64int A::*pa;
65int C::*pc;
66
67void f() {
68  // CHECK: store i64 -1, i64* @_ZN5Casts2paE
69  pa = 0;
70
71  // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = add i64 {{.*}}, 4
72  // CHECK: store i64 [[ADJ]], i64* @_ZN5Casts2pcE
73  pc = pa;
74
75  // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = sub i64 {{.*}}, 4
76  // CHECK: store i64 [[ADJ]], i64* @_ZN5Casts2paE
77  pa = static_cast<int A::*>(pc);
78}
79
80}
81
82// Comparisons
83namespace Comparisons {
84  void f() {
85    int A::*a;
86
87    // CHECK: icmp ne i64 {{.*}}, -1
88    if (a) { }
89
90    // CHECK: icmp ne i64 {{.*}}, -1
91    if (a != 0) { }
92
93    // CHECK: icmp ne i64 -1, {{.*}}
94    if (0 != a) { }
95
96    // CHECK: icmp eq i64 {{.*}}, -1
97    if (a == 0) { }
98
99    // CHECK: icmp eq i64 -1, {{.*}}
100    if (0 == a) { }
101  }
102}
103
104namespace ValueInit {
105
106struct A {
107  int A::*a;
108
109  char c;
110
111  A();
112};
113
114// CHECK: define void @_ZN9ValueInit1AC2Ev
115// CHECK: store i64 -1, i64*
116// CHECK: ret void
117A::A() : a() {}
118
119}
120
121namespace PR7139 {
122
123struct pair {
124  int first;
125  int second;
126};
127
128typedef int pair::*ptr_to_member_type;
129
130struct ptr_to_member_struct {
131  ptr_to_member_type data;
132  int i;
133};
134
135struct A {
136  ptr_to_member_struct a;
137
138  A() : a() {}
139};
140
141// CHECK-O3: define zeroext i1 @_ZN6PR71395checkEv() nounwind readnone
142bool check() {
143  // CHECK-O3: ret i1 true
144  return A().a.data == 0;
145}
146
147// CHECK-O3: define zeroext i1 @_ZN6PR71396check2Ev() nounwind readnone
148bool check2() {
149  // CHECK-O3: ret i1 true
150  return ptr_to_member_type() == 0;
151}
152
153}
154