member-function-pointers.cpp revision a4c98cd60e7151ea6eccfc677742bdbcf58d2a55
1ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson// RUN: clang-cc %s -emit-llvm -o - -triple=x86_64-apple-darwin9 | FileCheck %s
27b69956387785006244e7868f8dab09b371dbb6dAnders Carlsson
3f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlssonstruct A { int a; void f(); virtual void vf(); };
4f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlssonstruct B { int b; virtual void g(); };
57b69956387785006244e7868f8dab09b371dbb6dAnders Carlssonstruct C : B, A { };
67b69956387785006244e7868f8dab09b371dbb6dAnders Carlsson
77b69956387785006244e7868f8dab09b371dbb6dAnders Carlssonvoid (A::*pa)();
87b69956387785006244e7868f8dab09b371dbb6dAnders Carlssonvoid (A::*volatile vpa)();
97b69956387785006244e7868f8dab09b371dbb6dAnders Carlssonvoid (B::*pb)();
107b69956387785006244e7868f8dab09b371dbb6dAnders Carlssonvoid (C::*pc)();
117b69956387785006244e7868f8dab09b371dbb6dAnders Carlsson
12f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlsson// CHECK: @pa2 = global %0 { i64 ptrtoint (void ()* @_ZN1A1fEv to i64), i64 0 }, align 8
13f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlssonvoid (A::*pa2)() = &A::f;
14f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlsson
15f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlsson// CHECK: @pa3 = global %0 { i64 1, i64 0 }, align 8
16f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlssonvoid (A::*pa3)() = &A::vf;
17f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlsson
182c51f092e4d75550f51b4dd6f831aa5e5e6ae928Anders Carlsson// CHECK: @pc2 = global %0 { i64 ptrtoint (void ()* @_ZN1A1fEv to i64), i64 16 }, align 8
192c51f092e4d75550f51b4dd6f831aa5e5e6ae928Anders Carlssonvoid (C::*pc2)() = &C::f;
202c51f092e4d75550f51b4dd6f831aa5e5e6ae928Anders Carlsson
212c51f092e4d75550f51b4dd6f831aa5e5e6ae928Anders Carlsson// CHECK: @pc3 = global %0 { i64 1, i64 0 }, align 8
222c51f092e4d75550f51b4dd6f831aa5e5e6ae928Anders Carlssonvoid (A::*pc3)() = &A::vf;
232c51f092e4d75550f51b4dd6f831aa5e5e6ae928Anders Carlsson
247b69956387785006244e7868f8dab09b371dbb6dAnders Carlssonvoid f() {
25ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson  // CHECK: store i64 0, i64* getelementptr inbounds (%0* @pa, i32 0, i32 0)
26ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson  // CHECK: store i64 0, i64* getelementptr inbounds (%0* @pa, i32 0, i32 1)
277b69956387785006244e7868f8dab09b371dbb6dAnders Carlsson  pa = 0;
28ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson
29ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson  // CHECK: volatile store i64 0, i64* getelementptr inbounds (%0* @vpa, i32 0, i32 0)
30ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson  // CHECK: volatile store i64 0, i64* getelementptr inbounds (%0* @vpa, i32 0, i32 1)
317b69956387785006244e7868f8dab09b371dbb6dAnders Carlsson  vpa = 0;
32ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson
3347d1e828674a2d9c020db9f9ec45f27025a39e35Daniel Dunbar  // CHECK: store i64 {{.*}}, i64* getelementptr inbounds (%0* @pc, i32 0, i32 0)
3447d1e828674a2d9c020db9f9ec45f27025a39e35Daniel Dunbar  // CHECK: [[ADJ:%[a-zA-Z0-9\.]+]] = add i64 {{.*}}, 16
35ee383163a656a7e8d99efa4e5ee98c705c7fdf89Anders Carlsson  // CHECK: store i64 [[ADJ]], i64* getelementptr inbounds (%0* @pc, i32 0, i32 1)
36f57b4e44d03266f2ec1b427645555ed8952bc830Anders Carlsson  pc = pa;
377b69956387785006244e7868f8dab09b371dbb6dAnders Carlsson}
38a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson
39a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlssonvoid f2() {
40a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: [[pa2ptr:%[a-zA-Z0-9\.]+]] = getelementptr inbounds %0* %pa2, i32 0, i32 0
41a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: store i64 ptrtoint (void ()* @_ZN1A1fEv to i64), i64* [[pa2ptr]]
42a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: [[pa2adj:%[a-zA-Z0-9\.]+]] = getelementptr inbounds %0* %pa2, i32 0, i32 1
43a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: store i64 0, i64* [[pa2adj]]
44a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  void (A::*pa2)() = &A::f;
45a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson
46a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: [[pa3ptr:%[a-zA-Z0-9\.]+]] = getelementptr inbounds %0* %pa3, i32 0, i32 0
47a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: store i64 1, i64* [[pa3ptr]]
48a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  // CHECK: [[pa3adj:%[a-zA-Z0-9\.]+]] = getelementptr inbounds %0* %pa3, i32 0, i32 1
4947d1e828674a2d9c020db9f9ec45f27025a39e35Daniel Dunbar  // CHECK: store i64 0, i64* [[pa3adj]]
50a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson  void (A::*pa3)() = &A::vf;
51a024d17048cd7fb71bfaee3876993ef2c27057beAnders Carlsson}
52375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson
53375c31c4673f83f925de221752cf801c2fbbb246Anders Carlssonvoid f3(A *a, A &ar) {
54375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson  (a->*pa)();
55375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson  (ar.*pa)();
56375c31c4673f83f925de221752cf801c2fbbb246Anders Carlsson}
573eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson
58bc0e0781da778bd5eb41a810419912893ae20448Anders Carlssonbool f4() {
59bc0e0781da778bd5eb41a810419912893ae20448Anders Carlsson  return pa;
60bc0e0781da778bd5eb41a810419912893ae20448Anders Carlsson}
61bc0e0781da778bd5eb41a810419912893ae20448Anders Carlsson
623eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson// PR5177
633eea6350412eb7db13f0e2791c118920b36130a4Anders Carlssonnamespace PR5177 {
643eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson  struct A {
653eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson   bool foo(int*) const;
663eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson  } a;
673eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson
683eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson  struct B1 {
693eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson   bool (A::*pmf)(int*) const;
703eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson   const A* pa;
713eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson
723eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson   B1() : pmf(&A::foo), pa(&a) {}
733eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson   bool operator()() const { return (pa->*pmf)(new int); }
743eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson  };
753eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson
763eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson  void bar(B1 b2) { while (b2()) ; }
773eea6350412eb7db13f0e2791c118920b36130a4Anders Carlsson}
78bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson
79bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson// PR5138
80bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlssonnamespace PR5138 {
81bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  struct foo {
82bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson      virtual void bar(foo *);
83bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  };
84bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson
85bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  extern "C" {
86bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson    void baz(foo *);
87bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  }
88bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson
89bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  void (foo::*ptr1)(void *) = (void (foo::*)(void *))&foo::bar;
90bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  void (*ptr2)(void *) = (void (*)(void *))&baz;
91bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson
92bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson  void (foo::*ptr3)(void) = (void (foo::*)(void))&foo::bar;
93bb378cbf04e343fb15ae3611a153dde60671b514Anders Carlsson}
94a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson
95a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson// PR5593
96a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlssonnamespace PR5593 {
97a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson  struct A { };
98a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson
99a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson  bool f(void (A::*f)()) {
100a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson    return f && f;
101a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson  }
102a4c98cd60e7151ea6eccfc677742bdbcf58d2a55Anders Carlsson}
103