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