xref: /llvm-project/clang/test/CodeGenCXX/ptr-to-member-function.cpp (revision 623a911672518f0b1d4ca3b1d026f4a12638a9d7)
1*623a9116SRafael Espindola // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | \
2*623a9116SRafael Espindola // RUN: FileCheck -check-prefix CHECK-LP64 %s
3*623a9116SRafael Espindola // RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -emit-llvm %s -o - | \
4*623a9116SRafael Espindola // RUN: FileCheck -check-prefix CHECK-LP32 %s
5c9af8fd7SFariborz Jahanian // 13.3.3.2 Ranking implicit conversion sequences
6c9af8fd7SFariborz Jahanian 
7c9af8fd7SFariborz Jahanian extern "C" int printf(...);
8c9af8fd7SFariborz Jahanian 
9c9af8fd7SFariborz Jahanian struct A {
10c9af8fd7SFariborz Jahanian int Ai;
1118bc1954SFariborz Jahanian bool foo(int* arg) const;
12c9af8fd7SFariborz Jahanian };
13c9af8fd7SFariborz Jahanian 
foo(int * arg) const1418bc1954SFariborz Jahanian bool A::foo(int* arg) const {
1518bc1954SFariborz Jahanian     printf("A::foo(%d)\n", *arg);
1618bc1954SFariborz Jahanian     return true;
1718bc1954SFariborz Jahanian }
1818bc1954SFariborz Jahanian 
19c9af8fd7SFariborz Jahanian struct B : public A {
bfB20c9af8fd7SFariborz Jahanian   void bf() { printf("B::bf called\n"); }
21c9af8fd7SFariborz Jahanian };
22c9af8fd7SFariborz Jahanian 
23c9af8fd7SFariborz Jahanian struct C : public B { };
24c9af8fd7SFariborz Jahanian 
25c9af8fd7SFariborz Jahanian // conversion of B::* to C::* is better than conversion of A::* to C::*
26c9af8fd7SFariborz Jahanian typedef void (A::*pmfa)();
27c9af8fd7SFariborz Jahanian typedef void (B::*pmfb)();
28c9af8fd7SFariborz Jahanian typedef void (C::*pmfc)();
29c9af8fd7SFariborz Jahanian 
30c9af8fd7SFariborz Jahanian struct X {
31c9af8fd7SFariborz Jahanian 	operator pmfa();
operator pmfbX32c9af8fd7SFariborz Jahanian 	operator pmfb() {
33c9af8fd7SFariborz Jahanian 	  return &B::bf;
34c9af8fd7SFariborz Jahanian         }
35c9af8fd7SFariborz Jahanian };
36c9af8fd7SFariborz Jahanian 
37c9af8fd7SFariborz Jahanian 
g(pmfc pm)38c9af8fd7SFariborz Jahanian void g(pmfc pm) {
39c9af8fd7SFariborz Jahanian   C c;
40c9af8fd7SFariborz Jahanian   (c.*pm)();
41c9af8fd7SFariborz Jahanian }
42c9af8fd7SFariborz Jahanian 
test2(X x)43c9af8fd7SFariborz Jahanian void test2(X x)
44c9af8fd7SFariborz Jahanian {
45c9af8fd7SFariborz Jahanian     g(x);
46c9af8fd7SFariborz Jahanian }
47c9af8fd7SFariborz Jahanian 
4818bc1954SFariborz Jahanian struct B1 {
4918bc1954SFariborz Jahanian   bool (A::*pmf)(int*) const;
5018bc1954SFariborz Jahanian 
B1B15118bc1954SFariborz Jahanian   B1(int i) : pmf(&A::foo), im(i) {
5218bc1954SFariborz Jahanian     ((A*)this->*pmf)(&im);
5318bc1954SFariborz Jahanian   }
5418bc1954SFariborz Jahanian 
5518bc1954SFariborz Jahanian   int im;
5618bc1954SFariborz Jahanian };
5718bc1954SFariborz Jahanian 
main()58c9af8fd7SFariborz Jahanian int main()
59c9af8fd7SFariborz Jahanian {
60c9af8fd7SFariborz Jahanian 	X x;
61c9af8fd7SFariborz Jahanian 	test2(x);
6218bc1954SFariborz Jahanian         B1 b = B1(1);
6318bc1954SFariborz Jahanian   	B1 c = B1(2);
64c9af8fd7SFariborz Jahanian }
65c9af8fd7SFariborz Jahanian 
66*623a9116SRafael Espindola // CHECK-LP64: call { i64, i64 } @_ZN1XcvM1BFvvEEv
67*623a9116SRafael Espindola // CHECK-LP64: call void @_Z1gM1CFvvE
68c9af8fd7SFariborz Jahanian 
69*623a9116SRafael Espindola // CHECK-LP32: call i64 @_ZN1XcvM1BFvvEEv
70*623a9116SRafael Espindola // CHECK-LP32: call void @_Z1gM1CFvvE
71