xref: /llvm-project/clang/test/CodeGenCXX/ptr-to-datamember.cpp (revision 8fbe78f6fc7b41d1a4228c126fcb522131150518)
1*8fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -emit-llvm -o - %s
24ebdff5eSFariborz Jahanian 
34ebdff5eSFariborz Jahanian extern "C" int printf(...);
44ebdff5eSFariborz Jahanian 
5ffba662dSFariborz Jahanian struct F {
FF6ffba662dSFariborz Jahanian   F() : iF(1), fF(2.0) {}
7ffba662dSFariborz Jahanian   int iF;
8ffba662dSFariborz Jahanian   float fF;
9ffba662dSFariborz Jahanian };
10ffba662dSFariborz Jahanian 
11b25817acSFariborz Jahanian struct V {
12b25817acSFariborz Jahanian   double d;
13b25817acSFariborz Jahanian   int iV;
14b25817acSFariborz Jahanian };
15b25817acSFariborz Jahanian 
16b25817acSFariborz Jahanian struct B  : virtual V{
17b25817acSFariborz Jahanian   double d;
18b25817acSFariborz Jahanian   int iB;
19b25817acSFariborz Jahanian };
20b25817acSFariborz Jahanian 
21b25817acSFariborz Jahanian struct B1  : virtual V{
22b25817acSFariborz Jahanian   double d;
23b25817acSFariborz Jahanian   int iB1;
24b25817acSFariborz Jahanian };
25b25817acSFariborz Jahanian 
26b25817acSFariborz Jahanian class A  : public B, public B1 {
274ebdff5eSFariborz Jahanian public:
A()2852987dc5SFariborz Jahanian   A() : f(1.0), d(2.0), Ai(3) {}
294ebdff5eSFariborz Jahanian   float f;
304ebdff5eSFariborz Jahanian   double d;
314ebdff5eSFariborz Jahanian   int Ai;
32ffba662dSFariborz Jahanian   F Af;
334ebdff5eSFariborz Jahanian };
344ebdff5eSFariborz Jahanian 
35615ac67fSDouglas Gregor template <typename T> struct TT {
36615ac67fSDouglas Gregor   int T::t::*pti;
37615ac67fSDouglas Gregor };
38615ac67fSDouglas Gregor 
39615ac67fSDouglas Gregor struct I {
40615ac67fSDouglas Gregor   typedef I t;
41615ac67fSDouglas Gregor   int x;
42615ac67fSDouglas Gregor };
43615ac67fSDouglas Gregor 
pr(const F & b)44ffba662dSFariborz Jahanian void pr(const F& b) {
45ffba662dSFariborz Jahanian   printf(" %d %f\n", b.iF, b.fF);
46ffba662dSFariborz Jahanian }
47ffba662dSFariborz Jahanian 
test_aggr_pdata(A & a1)48ffba662dSFariborz Jahanian void test_aggr_pdata(A& a1) {
49ffba662dSFariborz Jahanian   F A::* af = &A::Af;
50ffba662dSFariborz Jahanian   pr(a1.*af);
51ffba662dSFariborz Jahanian 
52ffba662dSFariborz Jahanian   (a1.*af).iF = 100;
53ffba662dSFariborz Jahanian   (a1.*af).fF = 200.00;
54ffba662dSFariborz Jahanian   printf(" %d %f\n", (a1.*af).iF, (a1.*af).fF);
55ffba662dSFariborz Jahanian   pr(a1.*af);
56ffba662dSFariborz Jahanian 
57ffba662dSFariborz Jahanian   (a1.*af).iF++;
58ffba662dSFariborz Jahanian   (a1.*af).fF--;
59ffba662dSFariborz Jahanian   --(a1.*af).fF;
60ffba662dSFariborz Jahanian   pr(a1.*af);
61ffba662dSFariborz Jahanian }
62ffba662dSFariborz Jahanian 
test_aggr_pdata_1(A * pa)63038374f8SFariborz Jahanian void test_aggr_pdata_1(A* pa) {
64038374f8SFariborz Jahanian   F A::* af = &A::Af;
65038374f8SFariborz Jahanian   pr(pa->*af);
66038374f8SFariborz Jahanian 
67038374f8SFariborz Jahanian   (pa->*af).iF = 100;
68038374f8SFariborz Jahanian   (pa->*af).fF = 200.00;
69038374f8SFariborz Jahanian   printf(" %d %f\n", (pa->*af).iF, (pa->*af).fF);
70038374f8SFariborz Jahanian   pr(pa->*af);
71038374f8SFariborz Jahanian 
72038374f8SFariborz Jahanian   (pa->*af).iF++;
73038374f8SFariborz Jahanian   (pa->*af).fF--;
74038374f8SFariborz Jahanian   --(pa->*af).fF;
75038374f8SFariborz Jahanian   pr(pa->*af);
76038374f8SFariborz Jahanian }
77038374f8SFariborz Jahanian 
main()784ebdff5eSFariborz Jahanian int main()
794ebdff5eSFariborz Jahanian {
804ebdff5eSFariborz Jahanian   A a1;
81615ac67fSDouglas Gregor   TT<I> tt;
82615ac67fSDouglas Gregor   I i;
834ebdff5eSFariborz Jahanian   int A::* pa = &A::Ai;
844ebdff5eSFariborz Jahanian   float A::* pf = &A::f;
854ebdff5eSFariborz Jahanian   double A::* pd = &A::d;
86615ac67fSDouglas Gregor   tt.pti = &I::x;
874ebdff5eSFariborz Jahanian   printf("%d %d %d\n", &A::Ai, &A::f, &A::d);
88b25817acSFariborz Jahanian   printf("%d\n", &A::B::iB);
89b25817acSFariborz Jahanian   printf("%d\n", &A::B1::iB1);
90b25817acSFariborz Jahanian   printf("%d\n", &A::f);
91b25817acSFariborz Jahanian   printf("%d\n", &A::B::iV);
92b25817acSFariborz Jahanian   printf("%d\n", &A::B1::iV);
93b25817acSFariborz Jahanian   printf("%d\n", &A::B::V::iV);
94b25817acSFariborz Jahanian   printf("%d\n", &A::B1::V::iV);
9552987dc5SFariborz Jahanian   printf("%d, %f, %f  \n", a1.*pa, a1.*pf, a1.*pd);
96615ac67fSDouglas Gregor   printf("%d\n", i.*tt.pti);
97ffba662dSFariborz Jahanian   test_aggr_pdata(a1);
98038374f8SFariborz Jahanian   test_aggr_pdata_1(&a1);
994ebdff5eSFariborz Jahanian }
100