| // 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(); |
| } |