| // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s && |
| // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && |
| // RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s && |
| // RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s && |
| // RUN: true |
| // 13.3.3.2 Ranking implicit conversion sequences |
| |
| extern "C" int printf(...); |
| |
| struct A { |
| int Ai; |
| }; |
| |
| struct B : public A { |
| void bf() { printf("B::bf called\n"); } |
| }; |
| |
| struct C : public B { }; |
| |
| // conversion of B::* to C::* is better than conversion of A::* to C::* |
| typedef void (A::*pmfa)(); |
| typedef void (B::*pmfb)(); |
| typedef void (C::*pmfc)(); |
| |
| struct X { |
| operator pmfa(); |
| operator pmfb() { |
| return &B::bf; |
| } |
| }; |
| |
| |
| void g(pmfc pm) { |
| C c; |
| (c.*pm)(); |
| } |
| |
| void test2(X x) |
| { |
| g(x); |
| } |
| |
| int main() |
| { |
| X x; |
| test2(x); |
| } |
| |
| // CHECK-LP64: call __ZN1XcvM1BFvvEEv |
| // CHECK-LP64: call __Z1gM1CFvvE |
| |
| // CHECK-LP32: call L__ZN1XcvM1BFvvEEv |
| // CHECK-LP32: call __Z1gM1CFvvE |