]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGenCXX/ptr-to-datamember.cpp
Vendor import of clang 3.9.0 release r280324:
[FreeBSD/FreeBSD.git] / test / CodeGenCXX / ptr-to-datamember.cpp
1 // RUN: %clang_cc1 -emit-llvm -o - %s
2
3 extern "C" int printf(...);
4
5 struct F {
6   F() : iF(1), fF(2.0) {}
7   int iF;
8   float fF;
9 };
10
11 struct V {
12   double d;
13   int iV;
14 };
15
16 struct B  : virtual V{
17   double d;
18   int iB;
19 };
20
21 struct B1  : virtual V{
22   double d;
23   int iB1;
24 };
25
26 class A  : public B, public B1 {
27 public:
28   A() : f(1.0), d(2.0), Ai(3) {}
29   float f;
30   double d;
31   int Ai;
32   F Af;
33 }; 
34
35 template <typename T> struct TT {
36   int T::t::*pti;
37 };
38
39 struct I {
40   typedef I t;
41   int x;
42 };
43
44 void pr(const F& b) {
45   printf(" %d %f\n", b.iF, b.fF);
46 }
47
48 void 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
63 void 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
78 int 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 }