10ccb31c389a09216a5b60cf05bd01516ddbe8d4fGalina Kistanova// REQUIRES: x86-registered-target,x86-64-registered-target 2762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -S %s -o %t-64.s 34fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s 4762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -S %s -o %t-32.s 54fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s 67a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian// 13.3.3.2 Ranking implicit conversion sequences 77a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 87a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianextern "C" int printf(...); 97a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 107a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct A { 117a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianint Ai; 12105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanianbool foo(int* arg) const; 137a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian}; 147a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 15105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanianbool A::foo(int* arg) const { 16105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian printf("A::foo(%d)\n", *arg); 17105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian return true; 18105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian} 19105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 207a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct B : public A { 217a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian void bf() { printf("B::bf called\n"); } 227a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian}; 237a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 247a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct C : public B { }; 257a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 267a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian// conversion of B::* to C::* is better than conversion of A::* to C::* 277a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahaniantypedef void (A::*pmfa)(); 287a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahaniantypedef void (B::*pmfb)(); 297a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahaniantypedef void (C::*pmfc)(); 307a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 317a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct X { 327a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian operator pmfa(); 337a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian operator pmfb() { 347a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian return &B::bf; 357a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian } 367a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian}; 377a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 387a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 397a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianvoid g(pmfc pm) { 407a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian C c; 417a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian (c.*pm)(); 427a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian} 437a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 447a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianvoid test2(X x) 457a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian{ 467a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian g(x); 477a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian} 487a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 49105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanianstruct B1 { 50105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian bool (A::*pmf)(int*) const; 51105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 52105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian B1(int i) : pmf(&A::foo), im(i) { 53105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian ((A*)this->*pmf)(&im); 54105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian } 55105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 56105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian int im; 57105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian}; 58105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 597a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianint main() 607a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian{ 617a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian X x; 627a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian test2(x); 63105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian B1 b = B1(1); 64105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian B1 c = B1(2); 657a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian} 667a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 673b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1XcvM1BFvvEEv 683b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __Z1gM1CFvvE 697a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 70398e6b90f5e161d520a95cbf34c732a55fd3e476Chris Lattner// CHECK-LP32: calll L__ZN1XcvM1BFvvEEv 71398e6b90f5e161d520a95cbf34c732a55fd3e476Chris Lattner// CHECK-LP32: calll __Z1gM1CFvvE 72