llvm/lldb/test/API/commands/expression/codegen-crash-import-def-arraytype-element/main.cpp

// This is a reproducer for a crash during codegen. The base issue is when we
// Import the DeclContext we force FieldDecl that are RecordType to be defined
// since we need these to be defined in order to layout the class.
// This case involves an array member whose ElementType are records. In this
// case we need to check the ElementType of an ArrayType and if it is a record
// we need to import the definition.
struct A {
  int x;
};

struct B {
  // When we import the all the FieldDecl we need to check if we have an
  // ArrayType and then check if the ElementType is a RecordDecl and if so
  // import the definition. Otherwise during codegen we will attempt to layout A
  // but won't be able to.
  A s1[2];
  A s2[2][2][3];
  char o;
};

class FB {
public:
  union {
    struct {
      unsigned char *_s;
    } t;
    char *tt[1];
  } U;

  FB(B *p) : __private(p) {}

  // We import A but we don't import the definition.
  void f(A **bounds) {}

  void init();

private:
  B *__private;
};

void FB::init() {
  return; // break here
}

int main() {
  B b;
  FB fb(&b);

  b.o = 'A';

  fb.init();
}