blob: 3989c036288921d5351828d8a3dd54190914b55c [file] [log] [blame]
Galina Kistanova0ccb31c2011-06-03 22:24:54 +00001// REQUIRES: x86-registered-target,x86-64-registered-target
Richard Smith762bb9d2011-10-13 22:29:44 +00002// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -S %s -o %t-64.s
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00003// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
Richard Smith762bb9d2011-10-13 22:29:44 +00004// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -S %s -o %t-32.s
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00005// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s
Fariborz Jahanian7a1f4cc2009-10-23 18:08:22 +00006// 13.3.3.2 Ranking implicit conversion sequences
7
8extern "C" int printf(...);
9
10struct A {
11int Ai;
Fariborz Jahanian105aa512009-11-04 19:13:37 +000012bool foo(int* arg) const;
Fariborz Jahanian7a1f4cc2009-10-23 18:08:22 +000013};
14
Fariborz Jahanian105aa512009-11-04 19:13:37 +000015bool A::foo(int* arg) const {
16 printf("A::foo(%d)\n", *arg);
17 return true;
18}
19
Fariborz Jahanian7a1f4cc2009-10-23 18:08:22 +000020struct B : public A {
21 void bf() { printf("B::bf called\n"); }
22};
23
24struct C : public B { };
25
26// conversion of B::* to C::* is better than conversion of A::* to C::*
27typedef void (A::*pmfa)();
28typedef void (B::*pmfb)();
29typedef void (C::*pmfc)();
30
31struct X {
32 operator pmfa();
33 operator pmfb() {
34 return &B::bf;
35 }
36};
37
38
39void g(pmfc pm) {
40 C c;
41 (c.*pm)();
42}
43
44void test2(X x)
45{
46 g(x);
47}
48
Fariborz Jahanian105aa512009-11-04 19:13:37 +000049struct B1 {
50 bool (A::*pmf)(int*) const;
51
52 B1(int i) : pmf(&A::foo), im(i) {
53 ((A*)this->*pmf)(&im);
54 }
55
56 int im;
57};
58
Fariborz Jahanian7a1f4cc2009-10-23 18:08:22 +000059int main()
60{
61 X x;
62 test2(x);
Fariborz Jahanian105aa512009-11-04 19:13:37 +000063 B1 b = B1(1);
64 B1 c = B1(2);
Fariborz Jahanian7a1f4cc2009-10-23 18:08:22 +000065}
66
Sean Callanan3b299012009-12-18 00:04:09 +000067// CHECK-LP64: callq __ZN1XcvM1BFvvEEv
68// CHECK-LP64: callq __Z1gM1CFvvE
Fariborz Jahanian7a1f4cc2009-10-23 18:08:22 +000069
Chris Lattner398e6b92010-09-22 06:09:31 +000070// CHECK-LP32: calll L__ZN1XcvM1BFvvEEv
71// CHECK-LP32: calll __Z1gM1CFvvE