1*87aa9c9eSJonas Devlieghere // To avoid linking MSVC specific libs, we don't test virtual/override methods
2*87aa9c9eSJonas Devlieghere // that needs vftable support in this file.
3*87aa9c9eSJonas Devlieghere 
4*87aa9c9eSJonas Devlieghere // Enum.
5*87aa9c9eSJonas Devlieghere enum Enum { RED, GREEN, BLUE };
6*87aa9c9eSJonas Devlieghere Enum EnumVar;
7*87aa9c9eSJonas Devlieghere 
8*87aa9c9eSJonas Devlieghere // Union.
9*87aa9c9eSJonas Devlieghere union Union {
10*87aa9c9eSJonas Devlieghere   short Row;
11*87aa9c9eSJonas Devlieghere   unsigned short Col;
12*87aa9c9eSJonas Devlieghere   int Line : 16; // Test named bitfield.
13*87aa9c9eSJonas Devlieghere   short : 8;     // Unnamed bitfield symbol won't be generated in PDB.
14*87aa9c9eSJonas Devlieghere   long Table;
15*87aa9c9eSJonas Devlieghere };
16*87aa9c9eSJonas Devlieghere Union UnionVar;
17*87aa9c9eSJonas Devlieghere 
18*87aa9c9eSJonas Devlieghere // Struct.
19*87aa9c9eSJonas Devlieghere struct Struct;
20*87aa9c9eSJonas Devlieghere typedef Struct StructTypedef;
21*87aa9c9eSJonas Devlieghere 
22*87aa9c9eSJonas Devlieghere struct Struct {
23*87aa9c9eSJonas Devlieghere   bool A;
24*87aa9c9eSJonas Devlieghere   unsigned char UCharVar;
25*87aa9c9eSJonas Devlieghere   unsigned int UIntVar;
26*87aa9c9eSJonas Devlieghere   long long LongLongVar;
27*87aa9c9eSJonas Devlieghere   Enum EnumVar; // Test struct has UDT member.
28*87aa9c9eSJonas Devlieghere   int array[10];
29*87aa9c9eSJonas Devlieghere };
30*87aa9c9eSJonas Devlieghere struct Struct StructVar;
31*87aa9c9eSJonas Devlieghere 
32*87aa9c9eSJonas Devlieghere struct _List; // Forward declaration.
33*87aa9c9eSJonas Devlieghere struct Complex {
34*87aa9c9eSJonas Devlieghere   struct _List *array[90];
35*87aa9c9eSJonas Devlieghere   struct { // Test unnamed struct. MSVC treats it as `int x`
36*87aa9c9eSJonas Devlieghere     int x;
37*87aa9c9eSJonas Devlieghere   };
38*87aa9c9eSJonas Devlieghere   union { // Test unnamed union. MSVC treats it as `int a; float b;`
39*87aa9c9eSJonas Devlieghere     int a;
40*87aa9c9eSJonas Devlieghere     float b;
41*87aa9c9eSJonas Devlieghere   };
42*87aa9c9eSJonas Devlieghere };
43*87aa9c9eSJonas Devlieghere struct Complex c;
44*87aa9c9eSJonas Devlieghere 
45*87aa9c9eSJonas Devlieghere struct _List { // Test doubly linked list.
46*87aa9c9eSJonas Devlieghere   struct _List *current;
47*87aa9c9eSJonas Devlieghere   struct _List *previous;
48*87aa9c9eSJonas Devlieghere   struct _List *next;
49*87aa9c9eSJonas Devlieghere };
50*87aa9c9eSJonas Devlieghere struct _List ListVar;
51*87aa9c9eSJonas Devlieghere 
52*87aa9c9eSJonas Devlieghere typedef struct {
53*87aa9c9eSJonas Devlieghere   int a;
54*87aa9c9eSJonas Devlieghere } UnnamedStruct; // Test unnamed typedef-ed struct.
55*87aa9c9eSJonas Devlieghere UnnamedStruct UnnanmedVar;
56*87aa9c9eSJonas Devlieghere 
57*87aa9c9eSJonas Devlieghere // Class.
58*87aa9c9eSJonas Devlieghere namespace MemberTest {
59*87aa9c9eSJonas Devlieghere class Base {
60*87aa9c9eSJonas Devlieghere public:
61*87aa9c9eSJonas Devlieghere   Base() {}
62*87aa9c9eSJonas Devlieghere   ~Base() {}
63*87aa9c9eSJonas Devlieghere 
64*87aa9c9eSJonas Devlieghere public:
65*87aa9c9eSJonas Devlieghere   int Get() { return 0; }
66*87aa9c9eSJonas Devlieghere 
67*87aa9c9eSJonas Devlieghere protected:
68*87aa9c9eSJonas Devlieghere   int a;
69*87aa9c9eSJonas Devlieghere };
70*87aa9c9eSJonas Devlieghere class Friend {
71*87aa9c9eSJonas Devlieghere public:
72*87aa9c9eSJonas Devlieghere   int f() { return 3; }
73*87aa9c9eSJonas Devlieghere };
74*87aa9c9eSJonas Devlieghere class Class : public Base { // Test base class.
75*87aa9c9eSJonas Devlieghere   friend Friend;
76*87aa9c9eSJonas Devlieghere   static int m_static; // Test static member variable.
77*87aa9c9eSJonas Devlieghere public:
78*87aa9c9eSJonas Devlieghere   Class() : m_public(), m_private(), m_protected() {}
79*87aa9c9eSJonas Devlieghere   explicit Class(int a) { m_public = a; } // Test first reference of m_public.
80*87aa9c9eSJonas Devlieghere   ~Class() {}
81*87aa9c9eSJonas Devlieghere 
82*87aa9c9eSJonas Devlieghere   static int StaticMemberFunc(int a, ...) {
83*87aa9c9eSJonas Devlieghere     return 1;
84*87aa9c9eSJonas Devlieghere   } // Test static member function.
85*87aa9c9eSJonas Devlieghere   int Get() { return 1; }
86*87aa9c9eSJonas Devlieghere   int f(Friend c) { return c.f(); }
87*87aa9c9eSJonas Devlieghere   inline bool operator==(const Class &rhs) const // Test operator.
88*87aa9c9eSJonas Devlieghere   {
89*87aa9c9eSJonas Devlieghere     return (m_public == rhs.m_public);
90*87aa9c9eSJonas Devlieghere   }
91*87aa9c9eSJonas Devlieghere 
92*87aa9c9eSJonas Devlieghere public:
93*87aa9c9eSJonas Devlieghere   int m_public;
94*87aa9c9eSJonas Devlieghere   struct Struct m_struct;
95*87aa9c9eSJonas Devlieghere 
96*87aa9c9eSJonas Devlieghere private:
97*87aa9c9eSJonas Devlieghere   Union m_union;
98*87aa9c9eSJonas Devlieghere   int m_private;
99*87aa9c9eSJonas Devlieghere 
100*87aa9c9eSJonas Devlieghere protected:
101*87aa9c9eSJonas Devlieghere   friend class Friend;
102*87aa9c9eSJonas Devlieghere   int m_protected;
103*87aa9c9eSJonas Devlieghere };
104*87aa9c9eSJonas Devlieghere } // namespace MemberTest
105*87aa9c9eSJonas Devlieghere 
106*87aa9c9eSJonas Devlieghere int main() {
107*87aa9c9eSJonas Devlieghere   MemberTest::Base B1;
108*87aa9c9eSJonas Devlieghere   B1.Get();
109*87aa9c9eSJonas Devlieghere   MemberTest::Class::StaticMemberFunc(1, 10, 2);
110*87aa9c9eSJonas Devlieghere   return 0;
111*87aa9c9eSJonas Devlieghere }
112