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