llvm/lldb/test/Shell/SymbolFile/NativePDB/incomplete-tag-type.cpp

// clang-format off
// REQUIRES: lld, x86

// RUN: %clang_cl --target=x86_64-windows-msvc -c /Fo%t1.obj -- %p/Inputs/incomplete-tag-type.cpp
// RUN: %clang_cl --target=x86_64-windows-msvc /O1 /Z7 -c /Fo%t2.obj -- %s
// RUN: lld-link /debug:full /nodefaultlib /entry:main %t1.obj %t2.obj /out:%t.exe /pdb:%t.pdb
// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -o \
// RUN:   "settings set interpreter.stop-command-source-on-error false" \
// RUN:   -o "expression b" -o "expression d" -o "expression static_e_ref" -o "exit" 2>&1 | FileCheck %s

// CHECK: (lldb) expression b
// CHECK: (B) $0 = {}
// CHECK: (lldb) expression d
// CHECK: (D) $1 = {}
// CHECK: (lldb) expression static_e_ref
// CHECK: error:{{.*}}incomplete type 'E' where a complete type is required

// Complete base class.
struct A { int x; A(); };
struct B : A {};
B b;

// Complete data member.
struct C {
  C();
};

struct D {
  C c;
};
D d;

// Incomplete static data member should return error.
struct E {
  E();
};

struct F {
  static E static_e;
};

E F::static_e = E();
E& static_e_ref = F::static_e;

int main(){}