1 struct S;
2
3 // declare s0 as pointer to member of class S int
4 int S::*s0;
5 // declare s1 as pointer to pointer to member of class S int
6 int S::**s1;
7 // declare s2 as function returning pointer to member of class S int
8 int S::*s2();
s2()9 int S::*s2() { return 0; }
10 // declare s3 as pointer to function returning pointer to member of class S int
11 int S::*(*s3)();
12 // declare s4 as array 7 of pointer to member of class S int
13 int S::*s4[7];
14 // declare s5 as pointer to member of class S pointer to int
15 int *S::*s5;
16 // declare s6 as pointer to member of class S pointer to function returning int
17 int (*S::*s6)();
18 // declare s7 as pointer to member of class S function returning int
19 int (S::*s7)();
20 // declare s8 as pointer to member of class S array 7 of int
21 int (S::*s8)[7];
22 // declare s9 as volatile pointer to member of class S const int
23 const int S::* volatile s9;
24 // declare s10 as function (pointer to member of class S int) returning int
25 int s10(int S::*);
s10(int S::*)26 int s10(int S::*) { return 0; }
27
28 struct X {
29 void f(int);
30 int a;
31 };
32 struct Y;
33
34 int X::* pmi = &X::a;
35 void (X::* pmf)(int) = &X::f;
36 double X::* pmd;
37 char Y::* pmc;
38
39 typedef struct { int t; } T;
40 auto pmy = &T::t;
41
42 namespace {
43 struct Z { int z; };
44 }
45 int Z::* pmz = &Z::z;
pmz_fun()46 void pmz_fun() { (void) pmz; }
47
48 union U { int u; };
49 auto pmu = &U::u;
50
51 typedef const U CU;
52 auto pmcu = &CU::u;
53
54 struct B {
55 int x;
56 };
57
58 auto diff = &B::x;
59