xref: /llvm-project/lldb/test/Shell/SymbolFile/PDB/Inputs/ClassLayoutTest.cpp (revision 1a3bf2953a9209fdc4dbb6e99678e02a7fec019d)
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 Devlieghere int 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