1 // RUN: %clang_cc1 -emit-llvm -o - %s
2
3 extern "C" int printf(...);
4
5 struct F {
FF6 F() : iF(1), fF(2.0) {}
7 int iF;
8 float fF;
9 };
10
11 struct V {
12 double d;
13 int iV;
14 };
15
16 struct B : virtual V{
17 double d;
18 int iB;
19 };
20
21 struct B1 : virtual V{
22 double d;
23 int iB1;
24 };
25
26 class A : public B, public B1 {
27 public:
A()28 A() : f(1.0), d(2.0), Ai(3) {}
29 float f;
30 double d;
31 int Ai;
32 F Af;
33 };
34
35 template <typename T> struct TT {
36 int T::t::*pti;
37 };
38
39 struct I {
40 typedef I t;
41 int x;
42 };
43
pr(const F & b)44 void pr(const F& b) {
45 printf(" %d %f\n", b.iF, b.fF);
46 }
47
test_aggr_pdata(A & a1)48 void test_aggr_pdata(A& a1) {
49 F A::* af = &A::Af;
50 pr(a1.*af);
51
52 (a1.*af).iF = 100;
53 (a1.*af).fF = 200.00;
54 printf(" %d %f\n", (a1.*af).iF, (a1.*af).fF);
55 pr(a1.*af);
56
57 (a1.*af).iF++;
58 (a1.*af).fF--;
59 --(a1.*af).fF;
60 pr(a1.*af);
61 }
62
test_aggr_pdata_1(A * pa)63 void test_aggr_pdata_1(A* pa) {
64 F A::* af = &A::Af;
65 pr(pa->*af);
66
67 (pa->*af).iF = 100;
68 (pa->*af).fF = 200.00;
69 printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF);
70 pr(pa->*af);
71
72 (pa->*af).iF++;
73 (pa->*af).fF--;
74 --(pa->*af).fF;
75 pr(pa->*af);
76 }
77
main()78 int main()
79 {
80 A a1;
81 TT<I> tt;
82 I i;
83 int A::* pa = &A::Ai;
84 float A::* pf = &A::f;
85 double A::* pd = &A::d;
86 tt.pti = &I::x;
87 printf("%d %d %d\n", &A::Ai, &A::f, &A::d);
88 printf("%d\n", &A::B::iB);
89 printf("%d\n", &A::B1::iB1);
90 printf("%d\n", &A::f);
91 printf("%d\n", &A::B::iV);
92 printf("%d\n", &A::B1::iV);
93 printf("%d\n", &A::B::V::iV);
94 printf("%d\n", &A::B1::V::iV);
95 printf("%d, %f, %f \n", a1.*pa, a1.*pf, a1.*pd);
96 printf("%d\n", i.*tt.pti);
97 test_aggr_pdata(a1);
98 test_aggr_pdata_1(&a1);
99 }
100