1// This tests that we can deserialize and reserialize every known type record.
2// If you need to update the object file, enable the RUNX line below using MSVC
3// from VS 2012. Newer versions of MSVC emit tons of internal types for
4// attributes that pollute the test output. When Clang fully supports all these
5// type records, we can regenerate the test using it instead.
6
7// RUNX: cl -GR- -Z7 -c -TP %s -Fo%S/Inputs/codeview-types.obj
8// RUN: llvm-readobj --codeview %S/Inputs/codeview-types.obj | FileCheck %s
9// RUN: llvm-readobj --codeview-merged-types %S/Inputs/codeview-types.obj | FileCheck %s
10
11// TYPE_RECORD
12// CHECK-DAG: {{^ *Pointer (.*) {$}}
13// CHECK-DAG: {{^ *Modifier (.*) {$}}
14// CHECK-DAG: {{^ *Procedure (.*) {$}}
15// CHECK-DAG: {{^ *MemberFunction (.*) {$}}
16// CHECK-DAG: {{^ *ArgList (.*) {$}}
17// CHECK-DAG: {{^ *Array (.*) {$}}
18// CHECK-DAG: {{^ *Class (.*) {$}}
19// CHECK-DAG: {{^ *Union (.*) {$}}
20// CHECK-DAG: {{^ *Enum (.*) {$}}
21// CHECK-DAG: {{^ *VFTable (.*) {$}}
22// CHECK-DAG: {{^ *VFTableShape (.*) {$}}
23// CHECK-DAG: {{^ *FuncId (.*) {$}}
24// CHECK-DAG: {{^ *MemberFuncId (.*) {$}}
25// CHECK-DAG: {{^ *BuildInfo (.*) {$}}
26// CHECK-DAG: {{^ *StringId (.*) {$}}
27// CHECK-DAG: {{^ *UdtSourceLine (.*) {$}}
28// CHECK-DAG: {{^ *MethodOverloadList (.*) {$}}
29// No TypeServer2, since that is used with /Zi
30
31// MEMBER_RECORD
32// CHECK-DAG: {{^ *BaseClass {$}}
33// CHECK-DAG: {{^ *VirtualBaseClass {$}}
34// CHECK-DAG: {{^ *VFPtr {$}}
35// CHECK-DAG: {{^ *StaticDataMember {$}}
36// CHECK-DAG: {{^ *OverloadedMethod {$}}
37// CHECK-DAG: {{^ *DataMember {$}}
38// CHECK-DAG: {{^ *NestedType {$}}
39// CHECK-DAG: {{^ *OneMethod {$}}
40// CHECK-DAG: {{^ *Enumerator {$}}
41
42#if !defined(__clang__) && _MSC_VER >= 1800
43#error "use clang or MSVC 2012 to regenerate the test"
44#endif
45
46struct VBaseA;
47void FriendFunc();
48
49class Class {
50public:
51  const Class *DataMember;
52private:
53  static int StaticDataMember;
54protected:
55  virtual void MemberFunction();
56public:
57  struct Nested;
58  friend ::VBaseA;
59  friend void FriendFunc() { }
60  void OverloadedMethod();
61  void OverloadedMethod(int);
62};
63
64enum Enum {
65  E1 = 0,
66  E2 = 1
67};
68
69int array[4] = {1, 2, 3, 4};
70
71struct Class::Nested {};
72
73struct ClassWithBase : Class {
74  virtual void MemberFunction();
75  virtual void NewVirtual();
76};
77struct VBaseA { int x; };
78struct VBaseB : virtual VBaseA { int x; };
79struct VBaseC : virtual VBaseA { int x; };
80struct VBaseD : VBaseB, VBaseC { int x; };
81
82union Union {
83  float f;
84  int i;
85};
86
87void UseAllTypes() {
88  Class a;
89  Class::Nested b;
90  ClassWithBase c;
91  VBaseD d;
92  Union e;
93  Enum f;
94  FriendFunc();
95}
96