Mercurial > hg > CbC > CbC_llvm
view clang/test/CodeGenCXX/ptr-to-member-function.cpp @ 206:f17a3b42b08b
Added tag before-12 for changeset b7591485f4cd
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 07 Jun 2021 21:25:57 +0900 |
parents | 1d019706d866 |
children |
line wrap: on
line source
// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | \ // RUN: FileCheck -check-prefix CHECK-LP64 %s // RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -emit-llvm %s -o - | \ // RUN: FileCheck -check-prefix CHECK-LP32 %s // 13.3.3.2 Ranking implicit conversion sequences extern "C" int printf(...); struct A { int Ai; bool foo(int* arg) const; }; bool A::foo(int* arg) const { printf("A::foo(%d)\n", *arg); return true; } 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); } struct B1 { bool (A::*pmf)(int*) const; B1(int i) : pmf(&A::foo), im(i) { ((A*)this->*pmf)(&im); } int im; }; int main() { X x; test2(x); B1 b = B1(1); B1 c = B1(2); } // CHECK-LP64: call { i64, i64 } @_ZN1XcvM1BFvvEEv // CHECK-LP64: call void @_Z1gM1CFvvE // CHECK-LP32: call i64 @_ZN1XcvM1BFvvEEv // CHECK-LP32: call void @_Z1gM1CFvvE