34 lines · cpp
1// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s2/// Check that we pass the member pointers indirectly for MinGW643// RUN: %clang_cc1 %s -triple=x86_64-windows-gnu -emit-llvm -o - | FileCheck %s -check-prefix MINGW644/// We should be able to optimize calls via the indirectly passed member pointers5// RUN: %clang_cc1 %s -triple=x86_64-windows-gnu -emit-llvm -O3 -o - | FileCheck %s6struct A {7 virtual int vf1() { return 1; }8 virtual int vf2() { return 2; }9};10 11int f(A* a, int (A::*fp)()) {12 return (a->*fp)();13}14 15// CHECK-LABEL: define{{.*}} i32 @_Z2g1v()16// CHECK-NOT: }17// CHECK: ret i32 118// MINGW64-LABEL: define dso_local noundef i32 @_Z2g1v()19// MINGW64: call noundef i32 @_Z1fP1AMS_FivE(ptr noundef %{{.*}}, ptr dead_on_return noundef %{{.*}})20int g1() {21 A a;22 return f(&a, &A::vf1);23}24 25// CHECK-LABEL: define{{.*}} i32 @_Z2g2v()26// CHECK-NOT: }27// CHECK: ret i32 228// MINGW64-LABEL: define dso_local noundef i32 @_Z2g2v()29// MINGW64: call noundef i32 @_Z1fP1AMS_FivE(ptr noundef %{{.*}}, ptr dead_on_return noundef %{{.*}})30int g2() {31 A a;32 return f(&a, &A::vf2);33}34