119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project// RUN: %clang_cc1 -emit-llvm -o - %s
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern "C" int printf(...);
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct F {
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  F() : iF(1), fF(2.0) {}
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int iF;
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  float fF;
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct V {
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  double d;
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int iV;
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct B  : virtual V{
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  double d;
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int iB;
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct B1  : virtual V{
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  double d;
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int iB1;
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectclass A  : public B, public B1 {
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectpublic:
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  A() : f(1.0), d(2.0), Ai(3) {}
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  float f;
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  double d;
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int Ai;
323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt  F Af;
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttemplate <typename T> struct TT {
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int T::t::*pti;
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct I {
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  typedef I t;
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int x;
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid pr(const F& b) {
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf(" %d %f\n", b.iF, b.fF);
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid test_aggr_pdata(A& a1) {
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  F A::* af = &A::Af;
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  pr(a1.*af);
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (a1.*af).iF = 100;
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (a1.*af).fF = 200.00;
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf(" %d %f\n", (a1.*af).iF, (a1.*af).fF);
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  pr(a1.*af);
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (a1.*af).iF++;
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (a1.*af).fF--;
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  --(a1.*af).fF;
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  pr(a1.*af);
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid test_aggr_pdata_1(A* pa) {
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  F A::* af = &A::Af;
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  pr(pa->*af);
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (pa->*af).iF = 100;
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (pa->*af).fF = 200.00;
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF);
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  pr(pa->*af);
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (pa->*af).iF++;
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  (pa->*af).fF--;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  --(pa->*af).fF;
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  pr(pa->*af);
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main()
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  A a1;
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  TT<I> tt;
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  I i;
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int A::* pa = &A::Ai;
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  float A::* pf = &A::f;
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  double A::* pd = &A::d;
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  tt.pti = &I::x;
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d %d %d\n", &A::Ai, &A::f, &A::d);
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::B::iB);
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::B1::iB1);
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::f);
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::B::iV);
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::B1::iV);
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::B::V::iV);
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", &A::B1::V::iV);
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d, %f, %f  \n", a1.*pa, a1.*pf, a1.*pd);
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  printf("%d\n", i.*tt.pti);
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  test_aggr_pdata(a1);
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  test_aggr_pdata_1(&a1);
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project