// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -verify %s
// expected-no-diagnostics

typedef struct {
    char I[4];
    int S;
} Hdr;
typedef struct {
    short w;
} Hdr2;
typedef struct {
    Hdr2 usedtobeundef;
} Info;
typedef struct {
    const unsigned char *ib;
    int cur;
    int end;
} IB;
unsigned long gl(IB *input);
inline void gbs(IB *input, unsigned char *buf, int count);
void getB(IB *st, Hdr2 *usedtobeundef);
inline unsigned char gb(IB *input) {
    if (input->cur + 1 > input->end)
      ;
    return input->ib[(input->cur)++];
}
static void getID(IB *st, char str[4]) {
    str[0] = gb(st);
    str[1] = gb(st);
    str[2] = gb(st);
    str[3] = gb(st);
}
static void getH(IB *st, Hdr *header) {
    getID (st, header->I);
    header->S = gl(st);
}
static void readILBM(IB *st, Info *pic) {
    // Initialize field;
    pic->usedtobeundef.w = 5;

    // Time out in the function so that we will be forced to retry with no inlining.
    Hdr header;
    getH (st, &header);
    getID(st, header.I);
    int i = 0;
    while (st->cur < st->end && i < 4) {
      i++;
      getH (st, &header);
    }
}
int bitmapImageRepFromIFF(IB st, const unsigned char *ib, int il) {
    Info pic;
    st.ib = ib;
    st.cur = 0;
    st.end = il;
    readILBM(&st,&pic);
    return pic.usedtobeundef.w; // No undefined value warning here.
}
