// This tests that we can deserialize and reserialize every known type record. // If you need to update the object file, enable the RUNX line below using MSVC // from VS 2012. Newer versions of MSVC emit tons of internal types for // attributes that pollute the test output. When Clang fully supports all these // type records, we can regenerate the test using it instead. // RUNX: cl -GR- -Z7 -c -TP %s -Fo%S/Inputs/codeview-types.obj // RUN: llvm-readobj --codeview %S/Inputs/codeview-types.obj | FileCheck %s // RUN: llvm-readobj --codeview-merged-types %S/Inputs/codeview-types.obj | FileCheck %s // TYPE_RECORD // CHECK-DAG: {{^ *Pointer (.*) {$}} // CHECK-DAG: {{^ *Modifier (.*) {$}} // CHECK-DAG: {{^ *Procedure (.*) {$}} // CHECK-DAG: {{^ *MemberFunction (.*) {$}} // CHECK-DAG: {{^ *ArgList (.*) {$}} // CHECK-DAG: {{^ *Array (.*) {$}} // CHECK-DAG: {{^ *Class (.*) {$}} // CHECK-DAG: {{^ *Union (.*) {$}} // CHECK-DAG: {{^ *Enum (.*) {$}} // CHECK-DAG: {{^ *VFTable (.*) {$}} // CHECK-DAG: {{^ *VFTableShape (.*) {$}} // CHECK-DAG: {{^ *FuncId (.*) {$}} // CHECK-DAG: {{^ *MemberFuncId (.*) {$}} // CHECK-DAG: {{^ *BuildInfo (.*) {$}} // CHECK-DAG: {{^ *StringId (.*) {$}} // CHECK-DAG: {{^ *UdtSourceLine (.*) {$}} // CHECK-DAG: {{^ *MethodOverloadList (.*) {$}} // No TypeServer2, since that is used with /Zi // MEMBER_RECORD // CHECK-DAG: {{^ *BaseClass {$}} // CHECK-DAG: {{^ *VirtualBaseClass {$}} // CHECK-DAG: {{^ *VFPtr {$}} // CHECK-DAG: {{^ *StaticDataMember {$}} // CHECK-DAG: {{^ *OverloadedMethod {$}} // CHECK-DAG: {{^ *DataMember {$}} // CHECK-DAG: {{^ *NestedType {$}} // CHECK-DAG: {{^ *OneMethod {$}} // CHECK-DAG: {{^ *Enumerator {$}} #if !defined(__clang__) && _MSC_VER >= 1800 #error "use clang or MSVC 2012 to regenerate the test" #endif struct VBaseA; void FriendFunc(); class Class { public: const Class *DataMember; private: static int StaticDataMember; protected: virtual void MemberFunction(); public: struct Nested; friend ::VBaseA; friend void FriendFunc() { } void OverloadedMethod(); void OverloadedMethod(int); }; enum Enum { E1 = 0, E2 = 1 }; int array[4] = {1, 2, 3, 4}; struct Class::Nested {}; struct ClassWithBase : Class { virtual void MemberFunction(); virtual void NewVirtual(); }; struct VBaseA { int x; }; struct VBaseB : virtual VBaseA { int x; }; struct VBaseC : virtual VBaseA { int x; }; struct VBaseD : VBaseB, VBaseC { int x; }; union Union { float f; int i; }; void UseAllTypes() { Class a; Class::Nested b; ClassWithBase c; VBaseD d; Union e; Enum f; FriendFunc(); }