1; Test that the native PDB reader can enumerate pointer types. The output 2; being checked against is golden output generated by llvm-pdbutil without 3; the -native flag. Then we check that we generate the same output. 4 5; RUN: llvm-pdbutil pretty -native -pointers \ 6; RUN: %p/../Inputs/every-pointer.pdb | FileCheck %s --check-prefix=PRETTY 7; RUN: llvm-pdbutil diadump -no-ids -native -pointers \ 8; RUN: %p/../Inputs/every-pointer.pdb | FileCheck %s 9 10; PRETTY: Pointers: (29 items) 11; PRETTY-NEXT: char** 12; PRETTY-NEXT: struct Foo* 13; PRETTY-NEXT: int& 14; PRETTY-NEXT: const int* 15; PRETTY-NEXT: volatile int* 16; PRETTY-NEXT: const volatile int* 17; PRETTY-NEXT: int* 18; PRETTY-NEXT: int* 19; PRETTY-NEXT: struct __vc_attributes::event_sourceAttribute* 20; PRETTY-NEXT: struct __vc_attributes::helper_attributes::v1_alttypeAttribute* 21; PRETTY-NEXT: struct __vc_attributes::helper_attributes::usageAttribute* 22; PRETTY-NEXT: struct __vc_attributes::threadingAttribute* 23; PRETTY-NEXT: struct __vc_attributes::aggregatableAttribute* 24; PRETTY-NEXT: struct __vc_attributes::event_receiverAttribute* 25; PRETTY-NEXT: struct __vc_attributes::moduleAttribute* 26; PRETTY-NEXT: const char* 27; PRETTY-NEXT: int&& 28; PRETTY-NEXT: struct Foo* 29; PRETTY-NEXT: void (__cdecl Foo::*)() 30; PRETTY-NEXT: int Foo::* 31; PRETTY-NEXT: int (__cdecl Foo::*)() 32; PRETTY-NEXT: void (__cdecl *)() 33; PRETTY-NEXT: unaligned struct Foo* 34; PRETTY-NEXT: struct Foo* 35; PRETTY-NEXT: const struct Foo* 36; PRETTY-NEXT: volatile struct Foo* 37; PRETTY-NEXT: const volatile struct Foo* 38; PRETTY-NEXT: struct Foo&& 39; PRETTY-NEXT: struct Foo 40 41; CHECK: { 42; CHECK-NEXT: symTag: PointerType 43; CHECK-NEXT: length: 8 44; CHECK-NEXT: constType: 0 45; CHECK-NEXT: isPointerToDataMember: 0 46; CHECK-NEXT: isPointerToMemberFunction: 0 47; CHECK-NEXT: RValueReference: 0 48; CHECK-NEXT: reference: 0 49; CHECK-NEXT: restrictedType: 0 50; CHECK-NEXT: unalignedType: 0 51; CHECK-NEXT: volatileType: 0 52; CHECK-NEXT: } 53; CHECK-NEXT: { 54; CHECK-NEXT: symTag: PointerType 55; CHECK-NEXT: length: 8 56; CHECK-NEXT: constType: 0 57; CHECK-NEXT: isPointerToDataMember: 0 58; CHECK-NEXT: isPointerToMemberFunction: 0 59; CHECK-NEXT: RValueReference: 0 60; CHECK-NEXT: reference: 0 61; CHECK-NEXT: restrictedType: 0 62; CHECK-NEXT: unalignedType: 0 63; CHECK-NEXT: volatileType: 0 64; CHECK-NEXT: } 65; CHECK-NEXT: { 66; CHECK-NEXT: symTag: PointerType 67; CHECK-NEXT: length: 8 68; CHECK-NEXT: constType: 0 69; CHECK-NEXT: isPointerToDataMember: 0 70; CHECK-NEXT: isPointerToMemberFunction: 0 71; CHECK-NEXT: RValueReference: 0 72; CHECK-NEXT: reference: 1 73; CHECK-NEXT: restrictedType: 0 74; CHECK-NEXT: unalignedType: 0 75; CHECK-NEXT: volatileType: 0 76; CHECK-NEXT: } 77; CHECK-NEXT: { 78; CHECK-NEXT: symTag: PointerType 79; CHECK-NEXT: length: 8 80; CHECK-NEXT: constType: 0 81; CHECK-NEXT: isPointerToDataMember: 0 82; CHECK-NEXT: isPointerToMemberFunction: 0 83; CHECK-NEXT: RValueReference: 0 84; CHECK-NEXT: reference: 0 85; CHECK-NEXT: restrictedType: 0 86; CHECK-NEXT: unalignedType: 0 87; CHECK-NEXT: volatileType: 0 88; CHECK-NEXT: } 89; CHECK-NEXT: { 90; CHECK-NEXT: symTag: PointerType 91; CHECK-NEXT: length: 8 92; CHECK-NEXT: constType: 0 93; CHECK-NEXT: isPointerToDataMember: 0 94; CHECK-NEXT: isPointerToMemberFunction: 0 95; CHECK-NEXT: RValueReference: 0 96; CHECK-NEXT: reference: 0 97; CHECK-NEXT: restrictedType: 0 98; CHECK-NEXT: unalignedType: 0 99; CHECK-NEXT: volatileType: 0 100; CHECK-NEXT: } 101; CHECK-NEXT: { 102; CHECK-NEXT: symTag: PointerType 103; CHECK-NEXT: length: 8 104; CHECK-NEXT: constType: 0 105; CHECK-NEXT: isPointerToDataMember: 0 106; CHECK-NEXT: isPointerToMemberFunction: 0 107; CHECK-NEXT: RValueReference: 0 108; CHECK-NEXT: reference: 0 109; CHECK-NEXT: restrictedType: 0 110; CHECK-NEXT: unalignedType: 0 111; CHECK-NEXT: volatileType: 0 112; CHECK-NEXT: } 113; CHECK-NEXT: { 114; CHECK-NEXT: symTag: PointerType 115; CHECK-NEXT: length: 8 116; CHECK-NEXT: constType: 0 117; CHECK-NEXT: isPointerToDataMember: 0 118; CHECK-NEXT: isPointerToMemberFunction: 0 119; CHECK-NEXT: RValueReference: 0 120; CHECK-NEXT: reference: 0 121; CHECK-NEXT: restrictedType: 0 122; CHECK-NEXT: unalignedType: 0 123; CHECK-NEXT: volatileType: 0 124; CHECK-NEXT: } 125; CHECK-NEXT: { 126; CHECK-NEXT: symTag: PointerType 127; CHECK-NEXT: length: 8 128; CHECK-NEXT: constType: 0 129; CHECK-NEXT: isPointerToDataMember: 0 130; CHECK-NEXT: isPointerToMemberFunction: 0 131; CHECK-NEXT: RValueReference: 0 132; CHECK-NEXT: reference: 0 133; CHECK-NEXT: restrictedType: 1 134; CHECK-NEXT: unalignedType: 0 135; CHECK-NEXT: volatileType: 0 136; CHECK-NEXT: } 137; CHECK-NEXT: { 138; CHECK-NEXT: symTag: PointerType 139; CHECK-NEXT: length: 8 140; CHECK-NEXT: constType: 1 141; CHECK-NEXT: isPointerToDataMember: 0 142; CHECK-NEXT: isPointerToMemberFunction: 0 143; CHECK-NEXT: RValueReference: 0 144; CHECK-NEXT: reference: 0 145; CHECK-NEXT: restrictedType: 0 146; CHECK-NEXT: unalignedType: 0 147; CHECK-NEXT: volatileType: 0 148; CHECK-NEXT: } 149; CHECK-NEXT: { 150; CHECK-NEXT: symTag: PointerType 151; CHECK-NEXT: length: 8 152; CHECK-NEXT: constType: 1 153; CHECK-NEXT: isPointerToDataMember: 0 154; CHECK-NEXT: isPointerToMemberFunction: 0 155; CHECK-NEXT: RValueReference: 0 156; CHECK-NEXT: reference: 0 157; CHECK-NEXT: restrictedType: 0 158; CHECK-NEXT: unalignedType: 0 159; CHECK-NEXT: volatileType: 0 160; CHECK-NEXT: } 161; CHECK-NEXT: { 162; CHECK-NEXT: symTag: PointerType 163; CHECK-NEXT: length: 8 164; CHECK-NEXT: constType: 1 165; CHECK-NEXT: isPointerToDataMember: 0 166; CHECK-NEXT: isPointerToMemberFunction: 0 167; CHECK-NEXT: RValueReference: 0 168; CHECK-NEXT: reference: 0 169; CHECK-NEXT: restrictedType: 0 170; CHECK-NEXT: unalignedType: 0 171; CHECK-NEXT: volatileType: 0 172; CHECK-NEXT: } 173; CHECK-NEXT: { 174; CHECK-NEXT: symTag: PointerType 175; CHECK-NEXT: length: 8 176; CHECK-NEXT: constType: 1 177; CHECK-NEXT: isPointerToDataMember: 0 178; CHECK-NEXT: isPointerToMemberFunction: 0 179; CHECK-NEXT: RValueReference: 0 180; CHECK-NEXT: reference: 0 181; CHECK-NEXT: restrictedType: 0 182; CHECK-NEXT: unalignedType: 0 183; CHECK-NEXT: volatileType: 0 184; CHECK-NEXT: } 185; CHECK-NEXT: { 186; CHECK-NEXT: symTag: PointerType 187; CHECK-NEXT: length: 8 188; CHECK-NEXT: constType: 1 189; CHECK-NEXT: isPointerToDataMember: 0 190; CHECK-NEXT: isPointerToMemberFunction: 0 191; CHECK-NEXT: RValueReference: 0 192; CHECK-NEXT: reference: 0 193; CHECK-NEXT: restrictedType: 0 194; CHECK-NEXT: unalignedType: 0 195; CHECK-NEXT: volatileType: 0 196; CHECK-NEXT: } 197; CHECK-NEXT: { 198; CHECK-NEXT: symTag: PointerType 199; CHECK-NEXT: length: 8 200; CHECK-NEXT: constType: 1 201; CHECK-NEXT: isPointerToDataMember: 0 202; CHECK-NEXT: isPointerToMemberFunction: 0 203; CHECK-NEXT: RValueReference: 0 204; CHECK-NEXT: reference: 0 205; CHECK-NEXT: restrictedType: 0 206; CHECK-NEXT: unalignedType: 0 207; CHECK-NEXT: volatileType: 0 208; CHECK-NEXT: } 209; CHECK-NEXT: { 210; CHECK-NEXT: symTag: PointerType 211; CHECK-NEXT: length: 8 212; CHECK-NEXT: constType: 1 213; CHECK-NEXT: isPointerToDataMember: 0 214; CHECK-NEXT: isPointerToMemberFunction: 0 215; CHECK-NEXT: RValueReference: 0 216; CHECK-NEXT: reference: 0 217; CHECK-NEXT: restrictedType: 0 218; CHECK-NEXT: unalignedType: 0 219; CHECK-NEXT: volatileType: 0 220; CHECK-NEXT: } 221; CHECK-NEXT: { 222; CHECK-NEXT: symTag: PointerType 223; CHECK-NEXT: length: 8 224; CHECK-NEXT: constType: 0 225; CHECK-NEXT: isPointerToDataMember: 0 226; CHECK-NEXT: isPointerToMemberFunction: 0 227; CHECK-NEXT: RValueReference: 0 228; CHECK-NEXT: reference: 0 229; CHECK-NEXT: restrictedType: 0 230; CHECK-NEXT: unalignedType: 0 231; CHECK-NEXT: volatileType: 0 232; CHECK-NEXT: } 233; CHECK-NEXT: { 234; CHECK-NEXT: symTag: PointerType 235; CHECK-NEXT: length: 8 236; CHECK-NEXT: constType: 0 237; CHECK-NEXT: isPointerToDataMember: 0 238; CHECK-NEXT: isPointerToMemberFunction: 0 239; CHECK-NEXT: RValueReference: 1 240; CHECK-NEXT: reference: 0 241; CHECK-NEXT: restrictedType: 0 242; CHECK-NEXT: unalignedType: 0 243; CHECK-NEXT: volatileType: 0 244; CHECK-NEXT: } 245; CHECK-NEXT: { 246; CHECK-NEXT: symTag: PointerType 247; CHECK-NEXT: length: 8 248; CHECK-NEXT: constType: 1 249; CHECK-NEXT: isPointerToDataMember: 0 250; CHECK-NEXT: isPointerToMemberFunction: 0 251; CHECK-NEXT: RValueReference: 0 252; CHECK-NEXT: reference: 0 253; CHECK-NEXT: restrictedType: 0 254; CHECK-NEXT: unalignedType: 0 255; CHECK-NEXT: volatileType: 0 256; CHECK-NEXT: } 257; CHECK-NEXT: { 258; CHECK-NEXT: symTag: PointerType 259; CHECK-NEXT: length: 8 260; CHECK-NEXT: constType: 0 261; CHECK-NEXT: isPointerToDataMember: 0 262; CHECK-NEXT: isPointerToMemberFunction: 1 263; CHECK-NEXT: RValueReference: 0 264; CHECK-NEXT: reference: 0 265; CHECK-NEXT: restrictedType: 0 266; CHECK-NEXT: isSingleInheritance: 1 267; CHECK-NEXT: unalignedType: 0 268; CHECK-NEXT: volatileType: 0 269; CHECK-NEXT: } 270; CHECK-NEXT: { 271; CHECK-NEXT: symTag: PointerType 272; CHECK-NEXT: length: 4 273; CHECK-NEXT: constType: 0 274; CHECK-NEXT: isPointerToDataMember: 1 275; CHECK-NEXT: isPointerToMemberFunction: 0 276; CHECK-NEXT: RValueReference: 0 277; CHECK-NEXT: reference: 0 278; CHECK-NEXT: restrictedType: 0 279; CHECK-NEXT: isSingleInheritance: 1 280; CHECK-NEXT: unalignedType: 0 281; CHECK-NEXT: volatileType: 0 282; CHECK-NEXT: } 283; CHECK-NEXT: { 284; CHECK-NEXT: symTag: PointerType 285; CHECK-NEXT: length: 8 286; CHECK-NEXT: constType: 0 287; CHECK-NEXT: isPointerToDataMember: 0 288; CHECK-NEXT: isPointerToMemberFunction: 1 289; CHECK-NEXT: RValueReference: 0 290; CHECK-NEXT: reference: 0 291; CHECK-NEXT: restrictedType: 0 292; CHECK-NEXT: isSingleInheritance: 1 293; CHECK-NEXT: unalignedType: 0 294; CHECK-NEXT: volatileType: 0 295; CHECK-NEXT: } 296; CHECK-NEXT: { 297; CHECK-NEXT: symTag: PointerType 298; CHECK-NEXT: length: 8 299; CHECK-NEXT: constType: 0 300; CHECK-NEXT: isPointerToDataMember: 0 301; CHECK-NEXT: isPointerToMemberFunction: 0 302; CHECK-NEXT: RValueReference: 0 303; CHECK-NEXT: reference: 0 304; CHECK-NEXT: restrictedType: 0 305; CHECK-NEXT: unalignedType: 0 306; CHECK-NEXT: volatileType: 0 307; CHECK-NEXT: } 308; CHECK-NEXT: { 309; CHECK-NEXT: symTag: PointerType 310; CHECK-NEXT: length: 8 311; CHECK-NEXT: constType: 0 312; CHECK-NEXT: isPointerToDataMember: 0 313; CHECK-NEXT: isPointerToMemberFunction: 0 314; CHECK-NEXT: RValueReference: 0 315; CHECK-NEXT: reference: 0 316; CHECK-NEXT: restrictedType: 0 317; CHECK-NEXT: unalignedType: 0 318; CHECK-NEXT: volatileType: 0 319; CHECK-NEXT: } 320; CHECK-NEXT: { 321; CHECK-NEXT: symTag: PointerType 322; CHECK-NEXT: length: 8 323; CHECK-NEXT: constType: 0 324; CHECK-NEXT: isPointerToDataMember: 0 325; CHECK-NEXT: isPointerToMemberFunction: 0 326; CHECK-NEXT: RValueReference: 0 327; CHECK-NEXT: reference: 0 328; CHECK-NEXT: restrictedType: 1 329; CHECK-NEXT: unalignedType: 0 330; CHECK-NEXT: volatileType: 0 331; CHECK-NEXT: } 332; CHECK-NEXT: { 333; CHECK-NEXT: symTag: PointerType 334; CHECK-NEXT: length: 8 335; CHECK-NEXT: constType: 0 336; CHECK-NEXT: isPointerToDataMember: 0 337; CHECK-NEXT: isPointerToMemberFunction: 0 338; CHECK-NEXT: RValueReference: 0 339; CHECK-NEXT: reference: 0 340; CHECK-NEXT: restrictedType: 0 341; CHECK-NEXT: unalignedType: 0 342; CHECK-NEXT: volatileType: 0 343; CHECK-NEXT: } 344; CHECK-NEXT: { 345; CHECK-NEXT: symTag: PointerType 346; CHECK-NEXT: length: 8 347; CHECK-NEXT: constType: 0 348; CHECK-NEXT: isPointerToDataMember: 0 349; CHECK-NEXT: isPointerToMemberFunction: 0 350; CHECK-NEXT: RValueReference: 0 351; CHECK-NEXT: reference: 0 352; CHECK-NEXT: restrictedType: 0 353; CHECK-NEXT: unalignedType: 0 354; CHECK-NEXT: volatileType: 0 355; CHECK-NEXT: } 356; CHECK-NEXT: { 357; CHECK-NEXT: symTag: PointerType 358; CHECK-NEXT: length: 8 359; CHECK-NEXT: constType: 0 360; CHECK-NEXT: isPointerToDataMember: 0 361; CHECK-NEXT: isPointerToMemberFunction: 0 362; CHECK-NEXT: RValueReference: 0 363; CHECK-NEXT: reference: 0 364; CHECK-NEXT: restrictedType: 0 365; CHECK-NEXT: unalignedType: 0 366; CHECK-NEXT: volatileType: 0 367; CHECK-NEXT: } 368; CHECK-NEXT: { 369; CHECK-NEXT: symTag: PointerType 370; CHECK-NEXT: length: 8 371; CHECK-NEXT: constType: 0 372; CHECK-NEXT: isPointerToDataMember: 0 373; CHECK-NEXT: isPointerToMemberFunction: 0 374; CHECK-NEXT: RValueReference: 1 375; CHECK-NEXT: reference: 0 376; CHECK-NEXT: restrictedType: 0 377; CHECK-NEXT: unalignedType: 0 378; CHECK-NEXT: volatileType: 0 379; CHECK-NEXT: } 380; CHECK-NEXT: { 381; CHECK-NEXT: symTag: PointerType 382; CHECK-NEXT: length: 8 383; CHECK-NEXT: constType: 0 384; CHECK-NEXT: isPointerToDataMember: 0 385; CHECK-NEXT: isPointerToMemberFunction: 0 386; CHECK-NEXT: RValueReference: 0 387; CHECK-NEXT: reference: 1 388; CHECK-NEXT: restrictedType: 0 389; CHECK-NEXT: unalignedType: 0 390; CHECK-NEXT: volatileType: 0 391; CHECK-NEXT: }