1// RUN: %clang_cc1 -emit-llvm -o - %s
2
3extern "C" int printf(...);
4
5struct F {
6  F() : iF(1), fF(2.0) {}
7  int iF;
8  float fF;
9};
10
11struct V {
12  double d;
13  int iV;
14};
15
16struct B  : virtual V{
17  double d;
18  int iB;
19};
20
21struct B1  : virtual V{
22  double d;
23  int iB1;
24};
25
26class A  : public B, public B1 {
27public:
28  A() : f(1.0), d(2.0), Ai(3) {}
29  float f;
30  double d;
31  int Ai;
32  F Af;
33};
34
35template <typename T> struct TT {
36  int T::t::*pti;
37};
38
39struct I {
40  typedef I t;
41  int x;
42};
43
44void pr(const F& b) {
45  printf(" %d %f\n", b.iF, b.fF);
46}
47
48void 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
63void 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
78int 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