1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li // 13.3.3.2 Ranking implicit conversion sequences 5*67e74705SXin Li // conversion of A::* to B::* is better than conversion of A::* to C::*, 6*67e74705SXin Li struct A { 7*67e74705SXin Li int Ai; 8*67e74705SXin Li }; 9*67e74705SXin Li 10*67e74705SXin Li struct B : public A {}; 11*67e74705SXin Li struct C : public B {}; 12*67e74705SXin Li f(int C::*)13*67e74705SXin Liconst char * f(int C::*){ return ""; } f(int B::*)14*67e74705SXin Liint f(int B::*) { return 1; } 15*67e74705SXin Li 16*67e74705SXin Li struct D : public C {}; 17*67e74705SXin Li g(int B::*)18*67e74705SXin Liconst char * g(int B::*){ return ""; } g(int D::*)19*67e74705SXin Liint g(int D::*) { return 1; } 20*67e74705SXin Li test()21*67e74705SXin Livoid test() 22*67e74705SXin Li { 23*67e74705SXin Li int i = f(&A::Ai); 24*67e74705SXin Li 25*67e74705SXin Li const char * str = g(&A::Ai); 26*67e74705SXin Li } 27*67e74705SXin Li 28*67e74705SXin Li // conversion of B::* to C::* is better than conversion of A::* to C::* 29*67e74705SXin Li typedef void (A::*pmfa)(); 30*67e74705SXin Li typedef void (B::*pmfb)(); 31*67e74705SXin Li typedef void (C::*pmfc)(); 32*67e74705SXin Li 33*67e74705SXin Li struct X { 34*67e74705SXin Li operator pmfa(); 35*67e74705SXin Li operator pmfb(); 36*67e74705SXin Li }; 37*67e74705SXin Li 38*67e74705SXin Li 39*67e74705SXin Li void g(pmfc); 40*67e74705SXin Li test2(X x)41*67e74705SXin Livoid test2(X x) 42*67e74705SXin Li { 43*67e74705SXin Li g(x); 44*67e74705SXin Li } 45*67e74705SXin Li 46