100 lines · cpp
1// RUN: %clang_cc1 -emit-llvm -o - %s2 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