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