146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// RUN: %clang_cc1 -emit-llvm -o - %s 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)extern "C" int printf(...); 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct F { 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) F() : iF(1), fF(2.0) {} 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int iF; 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) float fF; 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct V { 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) double d; 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int iV; 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct B : virtual V{ 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) double d; 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int iB; 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct B1 : virtual V{ 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) double d; 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int iB1; 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 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