187aa9c9eSJonas Devlieghere // To avoid linking MSVC specific libs, we don't test virtual/override methods 287aa9c9eSJonas Devlieghere // that needs vftable support in this file. 387aa9c9eSJonas Devlieghere 487aa9c9eSJonas Devlieghere // Enum. 587aa9c9eSJonas Devlieghere enum Enum { RED, GREEN, BLUE }; 687aa9c9eSJonas Devlieghere Enum EnumVar; 787aa9c9eSJonas Devlieghere 887aa9c9eSJonas Devlieghere // Union. 987aa9c9eSJonas Devlieghere union Union { 1087aa9c9eSJonas Devlieghere short Row; 1187aa9c9eSJonas Devlieghere unsigned short Col; 1287aa9c9eSJonas Devlieghere int Line : 16; // Test named bitfield. 1387aa9c9eSJonas Devlieghere short : 8; // Unnamed bitfield symbol won't be generated in PDB. 1487aa9c9eSJonas Devlieghere long Table; 1587aa9c9eSJonas Devlieghere }; 1687aa9c9eSJonas Devlieghere Union UnionVar; 1787aa9c9eSJonas Devlieghere 1887aa9c9eSJonas Devlieghere // Struct. 1987aa9c9eSJonas Devlieghere struct Struct; 2087aa9c9eSJonas Devlieghere typedef Struct StructTypedef; 2187aa9c9eSJonas Devlieghere 2287aa9c9eSJonas Devlieghere struct Struct { 2387aa9c9eSJonas Devlieghere bool A; 2487aa9c9eSJonas Devlieghere unsigned char UCharVar; 2587aa9c9eSJonas Devlieghere unsigned int UIntVar; 2687aa9c9eSJonas Devlieghere long long LongLongVar; 2787aa9c9eSJonas Devlieghere Enum EnumVar; // Test struct has UDT member. 2887aa9c9eSJonas Devlieghere int array[10]; 2987aa9c9eSJonas Devlieghere }; 3087aa9c9eSJonas Devlieghere struct Struct StructVar; 3187aa9c9eSJonas Devlieghere 3287aa9c9eSJonas Devlieghere struct _List; // Forward declaration. 3387aa9c9eSJonas Devlieghere struct Complex { 3487aa9c9eSJonas Devlieghere struct _List *array[90]; 3587aa9c9eSJonas Devlieghere struct { // Test unnamed struct. MSVC treats it as `int x` 3687aa9c9eSJonas Devlieghere int x; 3787aa9c9eSJonas Devlieghere }; 3887aa9c9eSJonas Devlieghere union { // Test unnamed union. MSVC treats it as `int a; float b;` 3987aa9c9eSJonas Devlieghere int a; 4087aa9c9eSJonas Devlieghere float b; 4187aa9c9eSJonas Devlieghere }; 4287aa9c9eSJonas Devlieghere }; 4387aa9c9eSJonas Devlieghere struct Complex c; 4487aa9c9eSJonas Devlieghere 4587aa9c9eSJonas Devlieghere struct _List { // Test doubly linked list. 4687aa9c9eSJonas Devlieghere struct _List *current; 4787aa9c9eSJonas Devlieghere struct _List *previous; 4887aa9c9eSJonas Devlieghere struct _List *next; 4987aa9c9eSJonas Devlieghere }; 5087aa9c9eSJonas Devlieghere struct _List ListVar; 5187aa9c9eSJonas Devlieghere 5287aa9c9eSJonas Devlieghere typedef struct { 5387aa9c9eSJonas Devlieghere int a; 5487aa9c9eSJonas Devlieghere } UnnamedStruct; // Test unnamed typedef-ed struct. 5587aa9c9eSJonas Devlieghere UnnamedStruct UnnanmedVar; 5687aa9c9eSJonas Devlieghere 5787aa9c9eSJonas Devlieghere // Class. 5887aa9c9eSJonas Devlieghere namespace MemberTest { 5987aa9c9eSJonas Devlieghere class Base { 6087aa9c9eSJonas Devlieghere public: Base()6187aa9c9eSJonas Devlieghere Base() {} ~Base()6287aa9c9eSJonas Devlieghere ~Base() {} 6387aa9c9eSJonas Devlieghere 6487aa9c9eSJonas Devlieghere public: Get()6587aa9c9eSJonas Devlieghere int Get() { return 0; } 6687aa9c9eSJonas Devlieghere 6787aa9c9eSJonas Devlieghere protected: 6887aa9c9eSJonas Devlieghere int a; 6987aa9c9eSJonas Devlieghere }; 7087aa9c9eSJonas Devlieghere class Friend { 7187aa9c9eSJonas Devlieghere public: f()7287aa9c9eSJonas Devlieghere int f() { return 3; } 7387aa9c9eSJonas Devlieghere }; 7487aa9c9eSJonas Devlieghere class Class : public Base { // Test base class. 7587aa9c9eSJonas Devlieghere friend Friend; 7687aa9c9eSJonas Devlieghere static int m_static; // Test static member variable. 7787aa9c9eSJonas Devlieghere public: Class()7887aa9c9eSJonas Devlieghere Class() : m_public(), m_private(), m_protected() {} Class(int a)7987aa9c9eSJonas Devlieghere explicit Class(int a) { m_public = a; } // Test first reference of m_public. ~Class()8087aa9c9eSJonas Devlieghere ~Class() {} 8187aa9c9eSJonas Devlieghere StaticMemberFunc(int a,...)8287aa9c9eSJonas Devlieghere static int StaticMemberFunc(int a, ...) { 8387aa9c9eSJonas Devlieghere return 1; 8487aa9c9eSJonas Devlieghere } // Test static member function. Get()8587aa9c9eSJonas Devlieghere int Get() { return 1; } f(Friend c)8687aa9c9eSJonas Devlieghere int f(Friend c) { return c.f(); } operator ==(const Class & rhs) const8787aa9c9eSJonas Devlieghere inline bool operator==(const Class &rhs) const // Test operator. 8887aa9c9eSJonas Devlieghere { 8987aa9c9eSJonas Devlieghere return (m_public == rhs.m_public); 9087aa9c9eSJonas Devlieghere } 9187aa9c9eSJonas Devlieghere 9287aa9c9eSJonas Devlieghere public: 9387aa9c9eSJonas Devlieghere int m_public; 9487aa9c9eSJonas Devlieghere struct Struct m_struct; 9587aa9c9eSJonas Devlieghere 9687aa9c9eSJonas Devlieghere private: 9787aa9c9eSJonas Devlieghere Union m_union; 9887aa9c9eSJonas Devlieghere int m_private; 9987aa9c9eSJonas Devlieghere 10087aa9c9eSJonas Devlieghere protected: 10187aa9c9eSJonas Devlieghere friend class Friend; 10287aa9c9eSJonas Devlieghere int m_protected; 10387aa9c9eSJonas Devlieghere }; 10487aa9c9eSJonas Devlieghere } // namespace MemberTest 10587aa9c9eSJonas Devlieghere main()10687aa9c9eSJonas Devlieghereint main() { 10787aa9c9eSJonas Devlieghere MemberTest::Base B1; 10887aa9c9eSJonas Devlieghere B1.Get(); 109*1a3bf295SAmy Huang // Create instance of C1 so that it has debug info (due to constructor 110*1a3bf295SAmy Huang // homing). 111*1a3bf295SAmy Huang MemberTest::Class C1; 11287aa9c9eSJonas Devlieghere MemberTest::Class::StaticMemberFunc(1, 10, 2); 11387aa9c9eSJonas Devlieghere return 0; 11487aa9c9eSJonas Devlieghere } 115