1*8fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -emit-llvm -o - %s
24ebdff5eSFariborz Jahanian
34ebdff5eSFariborz Jahanian extern "C" int printf(...);
44ebdff5eSFariborz Jahanian
5ffba662dSFariborz Jahanian struct F {
FF6ffba662dSFariborz Jahanian F() : iF(1), fF(2.0) {}
7ffba662dSFariborz Jahanian int iF;
8ffba662dSFariborz Jahanian float fF;
9ffba662dSFariborz Jahanian };
10ffba662dSFariborz Jahanian
11b25817acSFariborz Jahanian struct V {
12b25817acSFariborz Jahanian double d;
13b25817acSFariborz Jahanian int iV;
14b25817acSFariborz Jahanian };
15b25817acSFariborz Jahanian
16b25817acSFariborz Jahanian struct B : virtual V{
17b25817acSFariborz Jahanian double d;
18b25817acSFariborz Jahanian int iB;
19b25817acSFariborz Jahanian };
20b25817acSFariborz Jahanian
21b25817acSFariborz Jahanian struct B1 : virtual V{
22b25817acSFariborz Jahanian double d;
23b25817acSFariborz Jahanian int iB1;
24b25817acSFariborz Jahanian };
25b25817acSFariborz Jahanian
26b25817acSFariborz Jahanian class A : public B, public B1 {
274ebdff5eSFariborz Jahanian public:
A()2852987dc5SFariborz Jahanian A() : f(1.0), d(2.0), Ai(3) {}
294ebdff5eSFariborz Jahanian float f;
304ebdff5eSFariborz Jahanian double d;
314ebdff5eSFariborz Jahanian int Ai;
32ffba662dSFariborz Jahanian F Af;
334ebdff5eSFariborz Jahanian };
344ebdff5eSFariborz Jahanian
35615ac67fSDouglas Gregor template <typename T> struct TT {
36615ac67fSDouglas Gregor int T::t::*pti;
37615ac67fSDouglas Gregor };
38615ac67fSDouglas Gregor
39615ac67fSDouglas Gregor struct I {
40615ac67fSDouglas Gregor typedef I t;
41615ac67fSDouglas Gregor int x;
42615ac67fSDouglas Gregor };
43615ac67fSDouglas Gregor
pr(const F & b)44ffba662dSFariborz Jahanian void pr(const F& b) {
45ffba662dSFariborz Jahanian printf(" %d %f\n", b.iF, b.fF);
46ffba662dSFariborz Jahanian }
47ffba662dSFariborz Jahanian
test_aggr_pdata(A & a1)48ffba662dSFariborz Jahanian void test_aggr_pdata(A& a1) {
49ffba662dSFariborz Jahanian F A::* af = &A::Af;
50ffba662dSFariborz Jahanian pr(a1.*af);
51ffba662dSFariborz Jahanian
52ffba662dSFariborz Jahanian (a1.*af).iF = 100;
53ffba662dSFariborz Jahanian (a1.*af).fF = 200.00;
54ffba662dSFariborz Jahanian printf(" %d %f\n", (a1.*af).iF, (a1.*af).fF);
55ffba662dSFariborz Jahanian pr(a1.*af);
56ffba662dSFariborz Jahanian
57ffba662dSFariborz Jahanian (a1.*af).iF++;
58ffba662dSFariborz Jahanian (a1.*af).fF--;
59ffba662dSFariborz Jahanian --(a1.*af).fF;
60ffba662dSFariborz Jahanian pr(a1.*af);
61ffba662dSFariborz Jahanian }
62ffba662dSFariborz Jahanian
test_aggr_pdata_1(A * pa)63038374f8SFariborz Jahanian void test_aggr_pdata_1(A* pa) {
64038374f8SFariborz Jahanian F A::* af = &A::Af;
65038374f8SFariborz Jahanian pr(pa->*af);
66038374f8SFariborz Jahanian
67038374f8SFariborz Jahanian (pa->*af).iF = 100;
68038374f8SFariborz Jahanian (pa->*af).fF = 200.00;
69038374f8SFariborz Jahanian printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF);
70038374f8SFariborz Jahanian pr(pa->*af);
71038374f8SFariborz Jahanian
72038374f8SFariborz Jahanian (pa->*af).iF++;
73038374f8SFariborz Jahanian (pa->*af).fF--;
74038374f8SFariborz Jahanian --(pa->*af).fF;
75038374f8SFariborz Jahanian pr(pa->*af);
76038374f8SFariborz Jahanian }
77038374f8SFariborz Jahanian
main()784ebdff5eSFariborz Jahanian int main()
794ebdff5eSFariborz Jahanian {
804ebdff5eSFariborz Jahanian A a1;
81615ac67fSDouglas Gregor TT<I> tt;
82615ac67fSDouglas Gregor I i;
834ebdff5eSFariborz Jahanian int A::* pa = &A::Ai;
844ebdff5eSFariborz Jahanian float A::* pf = &A::f;
854ebdff5eSFariborz Jahanian double A::* pd = &A::d;
86615ac67fSDouglas Gregor tt.pti = &I::x;
874ebdff5eSFariborz Jahanian printf("%d %d %d\n", &A::Ai, &A::f, &A::d);
88b25817acSFariborz Jahanian printf("%d\n", &A::B::iB);
89b25817acSFariborz Jahanian printf("%d\n", &A::B1::iB1);
90b25817acSFariborz Jahanian printf("%d\n", &A::f);
91b25817acSFariborz Jahanian printf("%d\n", &A::B::iV);
92b25817acSFariborz Jahanian printf("%d\n", &A::B1::iV);
93b25817acSFariborz Jahanian printf("%d\n", &A::B::V::iV);
94b25817acSFariborz Jahanian printf("%d\n", &A::B1::V::iV);
9552987dc5SFariborz Jahanian printf("%d, %f, %f \n", a1.*pa, a1.*pf, a1.*pd);
96615ac67fSDouglas Gregor printf("%d\n", i.*tt.pti);
97ffba662dSFariborz Jahanian test_aggr_pdata(a1);
98038374f8SFariborz Jahanian test_aggr_pdata_1(&a1);
994ebdff5eSFariborz Jahanian }
100