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