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