xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/ptr-to-datamember.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -emit-llvm -o - %s
2*f4a2713aSLionel Sambuc 
3*f4a2713aSLionel Sambuc extern "C" int printf(...);
4*f4a2713aSLionel Sambuc 
5*f4a2713aSLionel Sambuc struct F {
FF6*f4a2713aSLionel Sambuc   F() : iF(1), fF(2.0) {}
7*f4a2713aSLionel Sambuc   int iF;
8*f4a2713aSLionel Sambuc   float fF;
9*f4a2713aSLionel Sambuc };
10*f4a2713aSLionel Sambuc 
11*f4a2713aSLionel Sambuc struct V {
12*f4a2713aSLionel Sambuc   double d;
13*f4a2713aSLionel Sambuc   int iV;
14*f4a2713aSLionel Sambuc };
15*f4a2713aSLionel Sambuc 
16*f4a2713aSLionel Sambuc struct B  : virtual V{
17*f4a2713aSLionel Sambuc   double d;
18*f4a2713aSLionel Sambuc   int iB;
19*f4a2713aSLionel Sambuc };
20*f4a2713aSLionel Sambuc 
21*f4a2713aSLionel Sambuc struct B1  : virtual V{
22*f4a2713aSLionel Sambuc   double d;
23*f4a2713aSLionel Sambuc   int iB1;
24*f4a2713aSLionel Sambuc };
25*f4a2713aSLionel Sambuc 
26*f4a2713aSLionel Sambuc class A  : public B, public B1 {
27*f4a2713aSLionel Sambuc public:
A()28*f4a2713aSLionel Sambuc   A() : f(1.0), d(2.0), Ai(3) {}
29*f4a2713aSLionel Sambuc   float f;
30*f4a2713aSLionel Sambuc   double d;
31*f4a2713aSLionel Sambuc   int Ai;
32*f4a2713aSLionel Sambuc   F Af;
33*f4a2713aSLionel Sambuc };
34*f4a2713aSLionel Sambuc 
35*f4a2713aSLionel Sambuc template <typename T> struct TT {
36*f4a2713aSLionel Sambuc   int T::t::*pti;
37*f4a2713aSLionel Sambuc };
38*f4a2713aSLionel Sambuc 
39*f4a2713aSLionel Sambuc struct I {
40*f4a2713aSLionel Sambuc   typedef I t;
41*f4a2713aSLionel Sambuc   int x;
42*f4a2713aSLionel Sambuc };
43*f4a2713aSLionel Sambuc 
pr(const F & b)44*f4a2713aSLionel Sambuc void pr(const F& b) {
45*f4a2713aSLionel Sambuc   printf(" %d %f\n", b.iF, b.fF);
46*f4a2713aSLionel Sambuc }
47*f4a2713aSLionel Sambuc 
test_aggr_pdata(A & a1)48*f4a2713aSLionel Sambuc void test_aggr_pdata(A& a1) {
49*f4a2713aSLionel Sambuc   F A::* af = &A::Af;
50*f4a2713aSLionel Sambuc   pr(a1.*af);
51*f4a2713aSLionel Sambuc 
52*f4a2713aSLionel Sambuc   (a1.*af).iF = 100;
53*f4a2713aSLionel Sambuc   (a1.*af).fF = 200.00;
54*f4a2713aSLionel Sambuc   printf(" %d %f\n", (a1.*af).iF, (a1.*af).fF);
55*f4a2713aSLionel Sambuc   pr(a1.*af);
56*f4a2713aSLionel Sambuc 
57*f4a2713aSLionel Sambuc   (a1.*af).iF++;
58*f4a2713aSLionel Sambuc   (a1.*af).fF--;
59*f4a2713aSLionel Sambuc   --(a1.*af).fF;
60*f4a2713aSLionel Sambuc   pr(a1.*af);
61*f4a2713aSLionel Sambuc }
62*f4a2713aSLionel Sambuc 
test_aggr_pdata_1(A * pa)63*f4a2713aSLionel Sambuc void test_aggr_pdata_1(A* pa) {
64*f4a2713aSLionel Sambuc   F A::* af = &A::Af;
65*f4a2713aSLionel Sambuc   pr(pa->*af);
66*f4a2713aSLionel Sambuc 
67*f4a2713aSLionel Sambuc   (pa->*af).iF = 100;
68*f4a2713aSLionel Sambuc   (pa->*af).fF = 200.00;
69*f4a2713aSLionel Sambuc   printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF);
70*f4a2713aSLionel Sambuc   pr(pa->*af);
71*f4a2713aSLionel Sambuc 
72*f4a2713aSLionel Sambuc   (pa->*af).iF++;
73*f4a2713aSLionel Sambuc   (pa->*af).fF--;
74*f4a2713aSLionel Sambuc   --(pa->*af).fF;
75*f4a2713aSLionel Sambuc   pr(pa->*af);
76*f4a2713aSLionel Sambuc }
77*f4a2713aSLionel Sambuc 
main()78*f4a2713aSLionel Sambuc int main()
79*f4a2713aSLionel Sambuc {
80*f4a2713aSLionel Sambuc   A a1;
81*f4a2713aSLionel Sambuc   TT<I> tt;
82*f4a2713aSLionel Sambuc   I i;
83*f4a2713aSLionel Sambuc   int A::* pa = &A::Ai;
84*f4a2713aSLionel Sambuc   float A::* pf = &A::f;
85*f4a2713aSLionel Sambuc   double A::* pd = &A::d;
86*f4a2713aSLionel Sambuc   tt.pti = &I::x;
87*f4a2713aSLionel Sambuc   printf("%d %d %d\n", &A::Ai, &A::f, &A::d);
88*f4a2713aSLionel Sambuc   printf("%d\n", &A::B::iB);
89*f4a2713aSLionel Sambuc   printf("%d\n", &A::B1::iB1);
90*f4a2713aSLionel Sambuc   printf("%d\n", &A::f);
91*f4a2713aSLionel Sambuc   printf("%d\n", &A::B::iV);
92*f4a2713aSLionel Sambuc   printf("%d\n", &A::B1::iV);
93*f4a2713aSLionel Sambuc   printf("%d\n", &A::B::V::iV);
94*f4a2713aSLionel Sambuc   printf("%d\n", &A::B1::V::iV);
95*f4a2713aSLionel Sambuc   printf("%d, %f, %f  \n", a1.*pa, a1.*pf, a1.*pd);
96*f4a2713aSLionel Sambuc   printf("%d\n", i.*tt.pti);
97*f4a2713aSLionel Sambuc   test_aggr_pdata(a1);
98*f4a2713aSLionel Sambuc   test_aggr_pdata_1(&a1);
99*f4a2713aSLionel Sambuc }
100