| // clang-format off |
| // REQUIRES: lld, x86 |
| |
| // Test that we can display tag types. |
| // RUN: %clang_cl --target=x86_64-windows-msvc -GS- -Od -Z7 -c /Fo%t.obj -- %s |
| // RUN: lld-link -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb |
| // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \ |
| // RUN: %p/Inputs/tag-types.lldbinit | FileCheck %s |
| |
| // Test struct |
| struct Struct { |
| // Test builtin types, which are represented by special CodeView type indices. |
| bool B; |
| char C; |
| signed char SC; |
| unsigned char UC; |
| char16_t C16; |
| char32_t C32; |
| wchar_t WC; |
| short S; |
| unsigned short US; |
| int I; |
| unsigned int UI; |
| long L; |
| unsigned long UL; |
| long long LL; |
| unsigned long long ULL; |
| float F; |
| double D; |
| long double LD; |
| }; |
| |
| // Test class |
| class Class { |
| public: |
| // Test pointers to builtin types, which are represented by different special |
| // CodeView type indices. |
| bool *PB; |
| char *PC; |
| signed char *PSC; |
| unsigned char *PUC; |
| char16_t *PC16; |
| char32_t *PC32; |
| wchar_t *PWC; |
| short *PS; |
| unsigned short *PUS; |
| int *PI; |
| unsigned int *PUI; |
| long *PL; |
| unsigned long *PUL; |
| long long *PLL; |
| unsigned long long *PULL; |
| float *PF; |
| double *PD; |
| long double *PLD; |
| }; |
| |
| // Test union |
| union Union { |
| // Test modified types. |
| const bool *PB; |
| const char *PC; |
| const signed char *PSC; |
| const unsigned char *PUC; |
| const char16_t *PC16; |
| const char32_t *PC32; |
| const wchar_t *PWC; |
| const short *PS; |
| const unsigned short *PUS; |
| const int *PI; |
| const unsigned int *PUI; |
| const long *PL; |
| const unsigned long *PUL; |
| const long long *PLL; |
| const unsigned long long *PULL; |
| const float *PF; |
| const double *PD; |
| const long double *PLD; |
| }; |
| |
| struct OneMember { |
| int N = 0; |
| }; |
| |
| |
| // Test single inheritance. |
| class Derived : public Class { |
| public: |
| explicit Derived() |
| : Reference(*this), RefMember(Member), RValueRefMember((OneMember&&)Member) {} |
| |
| // Test reference to self, to make sure we don't end up in an |
| // infinite cycle. |
| Derived &Reference; |
| |
| // Test aggregate class member. |
| OneMember Member; |
| |
| // And modified aggregate class member. |
| const OneMember ConstMember; |
| volatile OneMember VolatileMember; |
| const volatile OneMember CVMember; |
| |
| // And all types of pointers to class members |
| OneMember *PtrMember; |
| OneMember &RefMember; |
| OneMember &&RValueRefMember; |
| }; |
| |
| // Test multiple inheritance, as well as protected and private inheritance. |
| class Derived2 : protected Class, private Struct { |
| public: |
| // Test static data members |
| static unsigned StaticDataMember; |
| }; |
| |
| unsigned Derived2::StaticDataMember = 0; |
| |
| // Test virtual inheritance. |
| class DerivedVirtual1 : public virtual Class {}; |
| |
| // Test the correctness of the virtual bases order. |
| class DerivedVirtual2 : public DerivedVirtual1, public virtual OneMember {}; |
| |
| // Test scoped enums and unscoped enums. |
| enum class EnumInt { |
| A = 1, |
| B = 2 |
| }; |
| |
| // Test explicit underlying types |
| enum EnumShort : short { |
| ES_A = 2, |
| ES_B = 3 |
| }; |
| |
| int main(int argc, char **argv) { |
| Struct S; |
| Class C; |
| Union U; |
| Derived D; |
| Derived2 D2; |
| DerivedVirtual1 DV1; |
| DerivedVirtual2 DV2; |
| EnumInt EI; |
| EnumShort ES; |
| |
| return 0; |
| } |
| |
| // CHECK: (lldb) target create "{{.*}}tag-types.cpp.tmp.exe" |
| // CHECK-NEXT: Current executable set to '{{.*}}tag-types.cpp.tmp.exe' |
| // CHECK-NEXT: (lldb) command source -s 0 '{{.*}}tag-types.lldbinit' |
| // CHECK-NEXT: Executing commands in '{{.*}}tag-types.lldbinit'. |
| // CHECK-NEXT: (lldb) type lookup -- Struct |
| // CHECK-NEXT: struct Struct { |
| // CHECK-NEXT: bool B; |
| // CHECK-NEXT: char C; |
| // CHECK-NEXT: signed char SC; |
| // CHECK-NEXT: unsigned char UC; |
| // CHECK-NEXT: char16_t C16; |
| // CHECK-NEXT: char32_t C32; |
| // CHECK-NEXT: wchar_t WC; |
| // CHECK-NEXT: short S; |
| // CHECK-NEXT: unsigned short US; |
| // CHECK-NEXT: int I; |
| // CHECK-NEXT: unsigned int UI; |
| // CHECK-NEXT: long L; |
| // CHECK-NEXT: unsigned long UL; |
| // CHECK-NEXT: long long LL; |
| // CHECK-NEXT: unsigned long long ULL; |
| // CHECK-NEXT: float F; |
| // CHECK-NEXT: double D; |
| // CHECK-NEXT: double LD; |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- Class |
| // CHECK-NEXT: class Class { |
| // CHECK-NEXT: bool *PB; |
| // CHECK-NEXT: char *PC; |
| // CHECK-NEXT: signed char *PSC; |
| // CHECK-NEXT: unsigned char *PUC; |
| // CHECK-NEXT: char16_t *PC16; |
| // CHECK-NEXT: char32_t *PC32; |
| // CHECK-NEXT: wchar_t *PWC; |
| // CHECK-NEXT: short *PS; |
| // CHECK-NEXT: unsigned short *PUS; |
| // CHECK-NEXT: int *PI; |
| // CHECK-NEXT: unsigned int *PUI; |
| // CHECK-NEXT: long *PL; |
| // CHECK-NEXT: unsigned long *PUL; |
| // CHECK-NEXT: long long *PLL; |
| // CHECK-NEXT: unsigned long long *PULL; |
| // CHECK-NEXT: float *PF; |
| // CHECK-NEXT: double *PD; |
| // CHECK-NEXT: double *PLD; |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- Union |
| // CHECK-NEXT: union Union { |
| // CHECK-NEXT: const bool *PB; |
| // CHECK-NEXT: const char *PC; |
| // CHECK-NEXT: const signed char *PSC; |
| // CHECK-NEXT: const unsigned char *PUC; |
| // CHECK-NEXT: const char16_t *PC16; |
| // CHECK-NEXT: const char32_t *PC32; |
| // CHECK-NEXT: const wchar_t *PWC; |
| // CHECK-NEXT: const short *PS; |
| // CHECK-NEXT: const unsigned short *PUS; |
| // CHECK-NEXT: const int *PI; |
| // CHECK-NEXT: const unsigned int *PUI; |
| // CHECK-NEXT: const long *PL; |
| // CHECK-NEXT: const unsigned long *PUL; |
| // CHECK-NEXT: const long long *PLL; |
| // CHECK-NEXT: const unsigned long long *PULL; |
| // CHECK-NEXT: const float *PF; |
| // CHECK-NEXT: const double *PD; |
| // CHECK-NEXT: const double *PLD; |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- Derived |
| // CHECK-NEXT: class Derived : public Class { |
| // CHECK: Derived &Reference; |
| // CHECK-NEXT: OneMember Member; |
| // CHECK-NEXT: const OneMember ConstMember; |
| // CHECK-NEXT: volatile OneMember VolatileMember; |
| // CHECK-NEXT: const volatile OneMember CVMember; |
| // CHECK-NEXT: OneMember *PtrMember; |
| // CHECK-NEXT: OneMember &RefMember; |
| // CHECK-NEXT: OneMember &&RValueRefMember; |
| // CHECK: } |
| // CHECK-NEXT: (lldb) type lookup -- Derived2 |
| // CHECK-NEXT: class Derived2 : protected Class, private Struct { |
| // CHECK-NEXT: static unsigned int StaticDataMember; |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- DerivedVirtual1 |
| // CHECK-NEXT: class DerivedVirtual1 : virtual public Class { |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- DerivedVirtual2 |
| // CHECK-NEXT: class DerivedVirtual2 : public DerivedVirtual1, virtual public Class, virtual public OneMember { |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- EnumInt |
| // CHECK-NEXT: enum EnumInt { |
| // CHECK-NEXT: A, |
| // CHECK-NEXT: B |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- EnumShort |
| // CHECK-NEXT: enum EnumShort { |
| // CHECK-NEXT: ES_A, |
| // CHECK-NEXT: ES_B |
| // CHECK-NEXT: } |
| // CHECK-NEXT: (lldb) type lookup -- InvalidType |
| // CHECK-NEXT: no type was found matching 'InvalidType' |