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