// RUN: %clang_cc1 -emit-llvm -o - %s extern "C" int printf(...); struct F { F() : iF(1), fF(2.0) {} int iF; float fF; }; struct V { double d; int iV; }; struct B : virtual V{ double d; int iB; }; struct B1 : virtual V{ double d; int iB1; }; class A : public B, public B1 { public: A() : f(1.0), d(2.0), Ai(3) {} float f; double d; int Ai; F Af; }; template struct TT { int T::t::*pti; }; struct I { typedef I t; int x; }; void pr(const F& b) { printf(" %d %f\n", b.iF, b.fF); } void test_aggr_pdata(A& a1) { F A::* af = &A::Af; pr(a1.*af); (a1.*af).iF = 100; (a1.*af).fF = 200.00; printf(" %d %f\n", (a1.*af).iF, (a1.*af).fF); pr(a1.*af); (a1.*af).iF++; (a1.*af).fF--; --(a1.*af).fF; pr(a1.*af); } void test_aggr_pdata_1(A* pa) { F A::* af = &A::Af; pr(pa->*af); (pa->*af).iF = 100; (pa->*af).fF = 200.00; printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF); pr(pa->*af); (pa->*af).iF++; (pa->*af).fF--; --(pa->*af).fF; pr(pa->*af); } int main() { A a1; TT tt; I i; int A::* pa = &A::Ai; float A::* pf = &A::f; double A::* pd = &A::d; tt.pti = &I::x; printf("%d %d %d\n", &A::Ai, &A::f, &A::d); printf("%d\n", &A::B::iB); printf("%d\n", &A::B1::iB1); printf("%d\n", &A::f); printf("%d\n", &A::B::iV); printf("%d\n", &A::B1::iV); printf("%d\n", &A::B::V::iV); printf("%d\n", &A::B1::V::iV); printf("%d, %f, %f \n", a1.*pa, a1.*pf, a1.*pd); printf("%d\n", i.*tt.pti); test_aggr_pdata(a1); test_aggr_pdata_1(&a1); }