typedef int Int;
typedef float Float;

// Matches
struct S0 {
  Int field1;
  Float field2;
};

struct S0 x0;

// Mismatch in field type
struct S1 {
  Int field1;
  int field2;
};

struct S1 x1;

// Mismatch in tag kind.
struct S2 { int i; float f; } x2;

// Missing fields
struct S3 { int i; float f; double d; } x3;

// Extra fields
struct S4 { int i; } x4;

// Bit-field matches
struct S5 { int i : 8; unsigned j : 8; } x5;

// Bit-field mismatch
struct S6 { int i : 8; unsigned j : 8; } x6;

// Bit-field mismatch
struct S7 { int i : 8; unsigned j : 8; } x7;

// Incomplete type
struct S8 *x8;

// Incomplete type
struct S9 { int i; float f; } *x9;

// Incomplete type
struct S10 *x10;

// Matches
struct ListNode {
  int value;
  struct ListNode *Next;
} xList;

// Mismatch due to struct used internally
struct DeepError {
  int value;
  struct DeeperError { int i; int f; } *Deeper;
} xDeep;

// Matches
struct {
  Int i;
  float f;
} x11;

// Matches
typedef struct {
  Int i;
  float f;
} S12;

S12 x12;

// Mismatch
typedef struct {
  Float i; // Mismatch here.
  float f;
} S13;

S13 x13;

// Matches
struct Unnamed {
  union {
    struct {
      int i;
    } S;
    struct {
      float i;
    } R;
  } U;
} x14;

// Matches
struct DeepUnnamed {
  union {
    union {
      struct {
        long i;
      } S;
      struct {
        int i;
      } R;
    } U1;
    union {
      struct {
        long i;
      } S;
      struct {
        float i;
      } T;
    } U2;
  } U;
  struct {
    long i;
  } V;
} x15;

// Mismatch due to unnamed struct used internally
struct DeepUnnamedError {
  union {
    union {
      struct {
        long i;
      } S;
      struct {
        int i;
      } R;
    } U1;
    union {
      struct {
        long i; // Mismatch here.
      } S;
      struct {
        float i;
      } T;
    } U2;
  } U;
  struct {
    long i;
  } V;
} x16;
