ptr-to-member-function.cpp revision 931a4feb64f18190d189c222d61b2abf52f18ab8
15c22c8074404797f1313b1334757254fb5c6487aEli Friedman// REQUIRES: x86-registered-target,x86-64-registered-target
25c22c8074404797f1313b1334757254fb5c6487aEli Friedman// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -S %s -o %t-64.s
35c22c8074404797f1313b1334757254fb5c6487aEli Friedman// RUN: FileCheck -check-prefix CHECK-LP64 --input-file=%t-64.s %s
45c22c8074404797f1313b1334757254fb5c6487aEli Friedman// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -S %s -o %t-32.s
55c22c8074404797f1313b1334757254fb5c6487aEli Friedman// RUN: FileCheck -check-prefix CHECK-LP32 --input-file=%t-32.s %s
65c22c8074404797f1313b1334757254fb5c6487aEli Friedman// 13.3.3.2 Ranking implicit conversion sequences
75c22c8074404797f1313b1334757254fb5c6487aEli Friedman
85c22c8074404797f1313b1334757254fb5c6487aEli Friedmanextern "C" int printf(...);
95c22c8074404797f1313b1334757254fb5c6487aEli Friedman
105c22c8074404797f1313b1334757254fb5c6487aEli Friedmanstruct A {
115c22c8074404797f1313b1334757254fb5c6487aEli Friedmanint Ai;
125c22c8074404797f1313b1334757254fb5c6487aEli Friedmanbool foo(int* arg) const;
13509150f973ae650a57b79010a3ec36e60e40f41dEli Friedman};
14509150f973ae650a57b79010a3ec36e60e40f41dEli Friedman
155c22c8074404797f1313b1334757254fb5c6487aEli Friedmanbool A::foo(int* arg) const {
165c22c8074404797f1313b1334757254fb5c6487aEli Friedman    printf("A::foo(%d)\n", *arg);
175c22c8074404797f1313b1334757254fb5c6487aEli Friedman    return true;
185c22c8074404797f1313b1334757254fb5c6487aEli Friedman}
195c22c8074404797f1313b1334757254fb5c6487aEli Friedman
205c22c8074404797f1313b1334757254fb5c6487aEli Friedmanstruct B : public A {
215c22c8074404797f1313b1334757254fb5c6487aEli Friedman  void bf() { printf("B::bf called\n"); }
225c22c8074404797f1313b1334757254fb5c6487aEli Friedman};
2398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
2498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohmanstruct C : public B { };
255c22c8074404797f1313b1334757254fb5c6487aEli Friedman
265c22c8074404797f1313b1334757254fb5c6487aEli Friedman// conversion of B::* to C::* is better than conversion of A::* to C::*
275c22c8074404797f1313b1334757254fb5c6487aEli Friedmantypedef void (A::*pmfa)();
285c22c8074404797f1313b1334757254fb5c6487aEli Friedmantypedef void (B::*pmfb)();
295c22c8074404797f1313b1334757254fb5c6487aEli Friedmantypedef void (C::*pmfc)();
305c22c8074404797f1313b1334757254fb5c6487aEli Friedman
315c22c8074404797f1313b1334757254fb5c6487aEli Friedmanstruct X {
325c22c8074404797f1313b1334757254fb5c6487aEli Friedman	operator pmfa();
335c22c8074404797f1313b1334757254fb5c6487aEli Friedman	operator pmfb() {
345c22c8074404797f1313b1334757254fb5c6487aEli Friedman	  return &B::bf;
355c22c8074404797f1313b1334757254fb5c6487aEli Friedman        }
365c22c8074404797f1313b1334757254fb5c6487aEli Friedman};
37d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman
385c22c8074404797f1313b1334757254fb5c6487aEli Friedman
395c22c8074404797f1313b1334757254fb5c6487aEli Friedmanvoid g(pmfc pm) {
40c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  C c;
41c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  (c.*pm)();
42c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
43ea387fc3b8cf12c3c6ad218b81eca156e8173bbaPreston Gurd
445c22c8074404797f1313b1334757254fb5c6487aEli Friedmanvoid test2(X x)
45c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines{
465c22c8074404797f1313b1334757254fb5c6487aEli Friedman    g(x);
475c22c8074404797f1313b1334757254fb5c6487aEli Friedman}
485c22c8074404797f1313b1334757254fb5c6487aEli Friedman
495c22c8074404797f1313b1334757254fb5c6487aEli Friedmanstruct B1 {
505c22c8074404797f1313b1334757254fb5c6487aEli Friedman  bool (A::*pmf)(int*) const;
515c22c8074404797f1313b1334757254fb5c6487aEli Friedman
525c22c8074404797f1313b1334757254fb5c6487aEli Friedman  B1(int i) : pmf(&A::foo), im(i) {
53c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    ((A*)this->*pmf)(&im);
545c22c8074404797f1313b1334757254fb5c6487aEli Friedman  }
55c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
56c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  int im;
575c22c8074404797f1313b1334757254fb5c6487aEli Friedman};
58c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
59c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesint main()
605c22c8074404797f1313b1334757254fb5c6487aEli Friedman{
61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines	X x;
62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines	test2(x);
63c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines        B1 b = B1(1);
64c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  	B1 c = B1(2);
65c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines}
66c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
67c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// CHECK-LP64: callq	__ZN1XcvM1BFvvEEv
68c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// CHECK-LP64: callq	__Z1gM1CFvvE
69c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
70c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// CHECK-LP32: calll	L__ZN1XcvM1BFvvEEv
71c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// CHECK-LP32: calll	__Z1gM1CFvvE
72c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines