1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm-only %s 2*67e74705SXin Li 3*67e74705SXin Li // Tests that Sema properly creates member-access expressions for 4*67e74705SXin Li // these instead of bare FieldDecls. 5*67e74705SXin Li 6*67e74705SXin Li struct Foo { 7*67e74705SXin Li int myvalue; 8*67e74705SXin Li 9*67e74705SXin Li // We have to override these to get something with an lvalue result. 10*67e74705SXin Li int &operator++(int); 11*67e74705SXin Li int &operator--(int); 12*67e74705SXin Li }; 13*67e74705SXin Li 14*67e74705SXin Li struct Test0 { 15*67e74705SXin Li Foo memfoo; 16*67e74705SXin Li int memint; 17*67e74705SXin Li int memarr[10]; 18*67e74705SXin Li Test0 *memptr; 19*67e74705SXin Li struct MemClass { int a; } memstruct; 20*67e74705SXin Li int &memfun(); 21*67e74705SXin Li testTest022*67e74705SXin Li void test() { 23*67e74705SXin Li int *p; 24*67e74705SXin Li p = &Test0::memfoo++; 25*67e74705SXin Li p = &Test0::memfoo--; 26*67e74705SXin Li p = &Test0::memarr[1]; 27*67e74705SXin Li p = &Test0::memptr->memint; 28*67e74705SXin Li p = &Test0::memstruct.a; 29*67e74705SXin Li p = &Test0::memfun(); 30*67e74705SXin Li } 31*67e74705SXin Li }; 32*67e74705SXin Li test0()33*67e74705SXin Livoid test0() { 34*67e74705SXin Li Test0 mytest; 35*67e74705SXin Li mytest.test(); 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li namespace rdar9065289 { 39*67e74705SXin Li typedef void (*FuncPtr)(); 40*67e74705SXin Li struct X0 { }; 41*67e74705SXin Li 42*67e74705SXin Li struct X1 43*67e74705SXin Li { 44*67e74705SXin Li X0* x0; 45*67e74705SXin Li FuncPtr X0::*fptr; 46*67e74705SXin Li }; 47*67e74705SXin Li f(X1 p)48*67e74705SXin Li void f(X1 p) { 49*67e74705SXin Li (p.x0->*(p.fptr))(); 50*67e74705SXin Li } 51*67e74705SXin Li } 52