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