| // RUN: clang-cc -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 <typename T> 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<I> 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); |
| } |