xref: /llvm-project/llvm/test/DebugInfo/PDB/Inputs/symbolformat.cpp (revision 08eb343cce893e2594de62f1ab976ed03536cb56)
1a54b7ddbSZachary Turner // Compile with "cl /c /Zi /GR- symbolformat.cpp"
2a54b7ddbSZachary Turner // Compile symbolformat-fpo.cpp (see file for instructions)
3a54b7ddbSZachary Turner // Link with "link symbolformat.obj symbolformat-fpo.obj /debug /nodefaultlib
4a54b7ddbSZachary Turner //    /entry:main /out:symbolformat.exe"
5a54b7ddbSZachary Turner 
_purecall(void)6a54b7ddbSZachary Turner int __cdecl _purecall(void) { return 0; }
7a54b7ddbSZachary Turner 
829c69105SZachary Turner enum TestEnum {
929c69105SZachary Turner   Value,
1029c69105SZachary Turner   Value10 = 10
1129c69105SZachary Turner };
1229c69105SZachary Turner 
1329c69105SZachary Turner enum class TestEnumClass {
1429c69105SZachary Turner   Value,
1529c69105SZachary Turner   Value10 = 10
1629c69105SZachary Turner };
1729c69105SZachary Turner 
18a54b7ddbSZachary Turner struct A {
PureFuncA19a54b7ddbSZachary Turner   virtual void PureFunc() = 0 {}
VirtualFuncA20a54b7ddbSZachary Turner   virtual void VirtualFunc() {}
RegularFuncA21a54b7ddbSZachary Turner   void RegularFunc() {}
22a54b7ddbSZachary Turner };
23a54b7ddbSZachary Turner 
2429c69105SZachary Turner struct VirtualBase {
25a54b7ddbSZachary Turner };
26a54b7ddbSZachary Turner 
2729c69105SZachary Turner struct B : public A, protected virtual VirtualBase {
PureFuncB2829c69105SZachary Turner   void PureFunc() override {}
29d270d22fSZachary Turner };
3029c69105SZachary Turner 
31d270d22fSZachary Turner struct MemberTest {
3229c69105SZachary Turner   enum NestedEnum {
3329c69105SZachary Turner     FirstVal,
3429c69105SZachary Turner     SecondVal
3529c69105SZachary Turner   };
3629c69105SZachary Turner 
3729c69105SZachary Turner   typedef int NestedTypedef;
38d270d22fSZachary Turner 
39d270d22fSZachary Turner   NestedEnum m_nested_enum;
40d270d22fSZachary Turner   NestedTypedef m_typedef;
41d270d22fSZachary Turner   bool m_bool;
42d270d22fSZachary Turner   char m_char;
43d270d22fSZachary Turner   wchar_t m_wchar_t;
44d270d22fSZachary Turner   int m_int;
45d270d22fSZachary Turner   unsigned m_unsigned;
46d270d22fSZachary Turner   long m_long;
47d270d22fSZachary Turner   unsigned long m_unsigned_long;
48d270d22fSZachary Turner   __int64 m_int64;
49d270d22fSZachary Turner   unsigned __int64 m_unsigned_int64;
50d270d22fSZachary Turner   float m_float;
51d270d22fSZachary Turner   double m_double;
52d270d22fSZachary Turner   void (*m_pfn_2_args)(int, double);
53*08eb343cSAdrian McCarthy   int m_multidimensional_array[2][3];
5429c69105SZachary Turner };
5529c69105SZachary Turner 
5629c69105SZachary Turner typedef int IntType;
5729c69105SZachary Turner typedef A ClassAType;
5829c69105SZachary Turner 
59db18f5caSZachary Turner int g_global_int;
60db18f5caSZachary Turner void *g_global_pointer = nullptr;
61db18f5caSZachary Turner 
62*08eb343cSAdrian McCarthy typedef int int_array[3];
63*08eb343cSAdrian McCarthy int_array g_array = { 1, 2, 3 };
64*08eb343cSAdrian McCarthy int_array *g_pointer_to_array = &g_array;
65*08eb343cSAdrian McCarthy const int *g_pointer_to_const_int = nullptr;
66*08eb343cSAdrian McCarthy int * const g_const_pointer_to_int = nullptr;
67*08eb343cSAdrian McCarthy const int * const g_const_pointer_to_const_int = nullptr;
68*08eb343cSAdrian McCarthy 
main(int argc,char ** argv)69a54b7ddbSZachary Turner int main(int argc, char **argv) {
70d270d22fSZachary Turner   // Force symbol references so the linker generates debug info
71a54b7ddbSZachary Turner   B b;
72d270d22fSZachary Turner   MemberTest members;
73a54b7ddbSZachary Turner   auto PureAddr = &B::PureFunc;
74a54b7ddbSZachary Turner   auto VirtualAddr = &A::PureFunc;
75a54b7ddbSZachary Turner   auto RegularAddr = &A::RegularFunc;
7629c69105SZachary Turner   TestEnum Enum = Value;
7729c69105SZachary Turner   TestEnumClass EnumClass = TestEnumClass::Value10;
7829c69105SZachary Turner   IntType Int = 12;
7929c69105SZachary Turner   ClassAType *ClassA = &b;
80a54b7ddbSZachary Turner   return 0;
81a54b7ddbSZachary Turner }
82