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