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