ptr-to-member-function.cpp revision 398e6b90f5e161d520a95cbf34c732a55fd3e476
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s 24fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s 3a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s 44fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s 57a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian// 13.3.3.2 Ranking implicit conversion sequences 67a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 77a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianextern "C" int printf(...); 87a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 97a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct A { 107a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianint Ai; 11105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanianbool foo(int* arg) const; 127a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian}; 137a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 14105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanianbool A::foo(int* arg) const { 15105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian printf("A::foo(%d)\n", *arg); 16105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian return true; 17105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian} 18105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 197a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct B : public A { 207a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian void bf() { printf("B::bf called\n"); } 217a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian}; 227a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 237a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct C : public B { }; 247a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 257a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian// conversion of B::* to C::* is better than conversion of A::* to C::* 267a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahaniantypedef void (A::*pmfa)(); 277a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahaniantypedef void (B::*pmfb)(); 287a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahaniantypedef void (C::*pmfc)(); 297a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 307a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianstruct X { 317a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian operator pmfa(); 327a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian operator pmfb() { 337a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian return &B::bf; 347a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian } 357a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian}; 367a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 377a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 387a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianvoid g(pmfc pm) { 397a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian C c; 407a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian (c.*pm)(); 417a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian} 427a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 437a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianvoid test2(X x) 447a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian{ 457a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian g(x); 467a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian} 477a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 48105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanianstruct B1 { 49105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian bool (A::*pmf)(int*) const; 50105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 51105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian B1(int i) : pmf(&A::foo), im(i) { 52105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian ((A*)this->*pmf)(&im); 53105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian } 54105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 55105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian int im; 56105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian}; 57105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian 587a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanianint main() 597a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian{ 607a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian X x; 617a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian test2(x); 62105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian B1 b = B1(1); 63105aa51c146b66f7dc4ac78faa9a7021acb98d75Fariborz Jahanian B1 c = B1(2); 647a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian} 657a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 663b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1XcvM1BFvvEEv 673b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __Z1gM1CFvvE 687a1f4cc8d5ce5813d8def23d6ec9783cb2f4450bFariborz Jahanian 69398e6b90f5e161d520a95cbf34c732a55fd3e476Chris Lattner// CHECK-LP32: calll L__ZN1XcvM1BFvvEEv 70398e6b90f5e161d520a95cbf34c732a55fd3e476Chris Lattner// CHECK-LP32: calll __Z1gM1CFvvE 71