| ; Test that the native PDB reader can enumerate pointer types. The output | |
| ; being checked against is golden output generated by llvm-pdbutil without | |
| ; the -native flag. Then we check that we generate the same output. | |
| ; RUN: llvm-pdbutil pretty -native -pointers \ | |
| ; RUN: %p/../Inputs/every-pointer.pdb | FileCheck %s --check-prefix=PRETTY | |
| ; RUN: llvm-pdbutil diadump -no-ids -native -pointers \ | |
| ; RUN: %p/../Inputs/every-pointer.pdb | FileCheck %s | |
| ; PRETTY: Pointers: (29 items) | |
| ; PRETTY-NEXT: char** | |
| ; PRETTY-NEXT: struct Foo* | |
| ; PRETTY-NEXT: int& | |
| ; PRETTY-NEXT: const int* | |
| ; PRETTY-NEXT: volatile int* | |
| ; PRETTY-NEXT: const volatile int* | |
| ; PRETTY-NEXT: int* | |
| ; PRETTY-NEXT: int* | |
| ; PRETTY-NEXT: struct __vc_attributes::event_sourceAttribute* | |
| ; PRETTY-NEXT: struct __vc_attributes::helper_attributes::v1_alttypeAttribute* | |
| ; PRETTY-NEXT: struct __vc_attributes::helper_attributes::usageAttribute* | |
| ; PRETTY-NEXT: struct __vc_attributes::threadingAttribute* | |
| ; PRETTY-NEXT: struct __vc_attributes::aggregatableAttribute* | |
| ; PRETTY-NEXT: struct __vc_attributes::event_receiverAttribute* | |
| ; PRETTY-NEXT: struct __vc_attributes::moduleAttribute* | |
| ; PRETTY-NEXT: const char* | |
| ; PRETTY-NEXT: int&& | |
| ; PRETTY-NEXT: struct Foo* | |
| ; PRETTY-NEXT: void (__cdecl Foo::*)() | |
| ; PRETTY-NEXT: int Foo::* | |
| ; PRETTY-NEXT: int (__cdecl Foo::*)() | |
| ; PRETTY-NEXT: void (__cdecl *)() | |
| ; PRETTY-NEXT: unaligned struct Foo* | |
| ; PRETTY-NEXT: struct Foo* | |
| ; PRETTY-NEXT: const struct Foo* | |
| ; PRETTY-NEXT: volatile struct Foo* | |
| ; PRETTY-NEXT: const volatile struct Foo* | |
| ; PRETTY-NEXT: struct Foo&& | |
| ; PRETTY-NEXT: struct Foo | |
| ; CHECK: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 1 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 1 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 1 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 1 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 1 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: isSingleInheritance: 1 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 4 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 1 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: isSingleInheritance: 1 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 1 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: isSingleInheritance: 1 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 1 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 1 | |
| ; CHECK-NEXT: reference: 0 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } | |
| ; CHECK-NEXT: { | |
| ; CHECK-NEXT: symTag: PointerType | |
| ; CHECK-NEXT: length: 8 | |
| ; CHECK-NEXT: constType: 0 | |
| ; CHECK-NEXT: isPointerToDataMember: 0 | |
| ; CHECK-NEXT: isPointerToMemberFunction: 0 | |
| ; CHECK-NEXT: RValueReference: 0 | |
| ; CHECK-NEXT: reference: 1 | |
| ; CHECK-NEXT: restrictedType: 0 | |
| ; CHECK-NEXT: unalignedType: 0 | |
| ; CHECK-NEXT: volatileType: 0 | |
| ; CHECK-NEXT: } |