1// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | \ 2// RUN: FileCheck -check-prefix CHECK-LP64 %s 3// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -emit-llvm %s -o - | \ 4// RUN: FileCheck -check-prefix CHECK-LP32 %s 5// 13.3.3.2 Ranking implicit conversion sequences 6 7extern "C" int printf(...); 8 9struct A { 10int Ai; 11bool foo(int* arg) const; 12}; 13 14bool A::foo(int* arg) const { 15 printf("A::foo(%d)\n", *arg); 16 return true; 17} 18 19struct B : public A { 20 void bf() { printf("B::bf called\n"); } 21}; 22 23struct C : public B { }; 24 25// conversion of B::* to C::* is better than conversion of A::* to C::* 26typedef void (A::*pmfa)(); 27typedef void (B::*pmfb)(); 28typedef void (C::*pmfc)(); 29 30struct X { 31 operator pmfa(); 32 operator pmfb() { 33 return &B::bf; 34 } 35}; 36 37 38void g(pmfc pm) { 39 C c; 40 (c.*pm)(); 41} 42 43void test2(X x) 44{ 45 g(x); 46} 47 48struct B1 { 49 bool (A::*pmf)(int*) const; 50 51 B1(int i) : pmf(&A::foo), im(i) { 52 ((A*)this->*pmf)(&im); 53 } 54 55 int im; 56}; 57 58int main() 59{ 60 X x; 61 test2(x); 62 B1 b = B1(1); 63 B1 c = B1(2); 64} 65 66// CHECK-LP64: call { i64, i64 } @_ZN1XcvM1BFvvEEv 67// CHECK-LP64: call void @_Z1gM1CFvvE 68 69// CHECK-LP32: call i64 @_ZN1XcvM1BFvvEEv 70// CHECK-LP32: call void @_Z1gM1CFvvE 71