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