1*623a9116SRafael Espindola // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | \ 2*623a9116SRafael Espindola // RUN: FileCheck -check-prefix CHECK-LP64 %s 3*623a9116SRafael Espindola // RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -emit-llvm %s -o - | \ 4*623a9116SRafael Espindola // RUN: FileCheck -check-prefix CHECK-LP32 %s 5c9af8fd7SFariborz Jahanian // 13.3.3.2 Ranking implicit conversion sequences 6c9af8fd7SFariborz Jahanian 7c9af8fd7SFariborz Jahanian extern "C" int printf(...); 8c9af8fd7SFariborz Jahanian 9c9af8fd7SFariborz Jahanian struct A { 10c9af8fd7SFariborz Jahanian int Ai; 1118bc1954SFariborz Jahanian bool foo(int* arg) const; 12c9af8fd7SFariborz Jahanian }; 13c9af8fd7SFariborz Jahanian foo(int * arg) const1418bc1954SFariborz Jahanianbool A::foo(int* arg) const { 1518bc1954SFariborz Jahanian printf("A::foo(%d)\n", *arg); 1618bc1954SFariborz Jahanian return true; 1718bc1954SFariborz Jahanian } 1818bc1954SFariborz Jahanian 19c9af8fd7SFariborz Jahanian struct B : public A { bfB20c9af8fd7SFariborz Jahanian void bf() { printf("B::bf called\n"); } 21c9af8fd7SFariborz Jahanian }; 22c9af8fd7SFariborz Jahanian 23c9af8fd7SFariborz Jahanian struct C : public B { }; 24c9af8fd7SFariborz Jahanian 25c9af8fd7SFariborz Jahanian // conversion of B::* to C::* is better than conversion of A::* to C::* 26c9af8fd7SFariborz Jahanian typedef void (A::*pmfa)(); 27c9af8fd7SFariborz Jahanian typedef void (B::*pmfb)(); 28c9af8fd7SFariborz Jahanian typedef void (C::*pmfc)(); 29c9af8fd7SFariborz Jahanian 30c9af8fd7SFariborz Jahanian struct X { 31c9af8fd7SFariborz Jahanian operator pmfa(); operator pmfbX32c9af8fd7SFariborz Jahanian operator pmfb() { 33c9af8fd7SFariborz Jahanian return &B::bf; 34c9af8fd7SFariborz Jahanian } 35c9af8fd7SFariborz Jahanian }; 36c9af8fd7SFariborz Jahanian 37c9af8fd7SFariborz Jahanian g(pmfc pm)38c9af8fd7SFariborz Jahanianvoid g(pmfc pm) { 39c9af8fd7SFariborz Jahanian C c; 40c9af8fd7SFariborz Jahanian (c.*pm)(); 41c9af8fd7SFariborz Jahanian } 42c9af8fd7SFariborz Jahanian test2(X x)43c9af8fd7SFariborz Jahanianvoid test2(X x) 44c9af8fd7SFariborz Jahanian { 45c9af8fd7SFariborz Jahanian g(x); 46c9af8fd7SFariborz Jahanian } 47c9af8fd7SFariborz Jahanian 4818bc1954SFariborz Jahanian struct B1 { 4918bc1954SFariborz Jahanian bool (A::*pmf)(int*) const; 5018bc1954SFariborz Jahanian B1B15118bc1954SFariborz Jahanian B1(int i) : pmf(&A::foo), im(i) { 5218bc1954SFariborz Jahanian ((A*)this->*pmf)(&im); 5318bc1954SFariborz Jahanian } 5418bc1954SFariborz Jahanian 5518bc1954SFariborz Jahanian int im; 5618bc1954SFariborz Jahanian }; 5718bc1954SFariborz Jahanian main()58c9af8fd7SFariborz Jahanianint main() 59c9af8fd7SFariborz Jahanian { 60c9af8fd7SFariborz Jahanian X x; 61c9af8fd7SFariborz Jahanian test2(x); 6218bc1954SFariborz Jahanian B1 b = B1(1); 6318bc1954SFariborz Jahanian B1 c = B1(2); 64c9af8fd7SFariborz Jahanian } 65c9af8fd7SFariborz Jahanian 66*623a9116SRafael Espindola // CHECK-LP64: call { i64, i64 } @_ZN1XcvM1BFvvEEv 67*623a9116SRafael Espindola // CHECK-LP64: call void @_Z1gM1CFvvE 68c9af8fd7SFariborz Jahanian 69*623a9116SRafael Espindola // CHECK-LP32: call i64 @_ZN1XcvM1BFvvEEv 70*623a9116SRafael Espindola // CHECK-LP32: call void @_Z1gM1CFvvE 71