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