// RUN: %clang -target x86_64-unknown-freebsd --analyze %s

#include "Inputs/system-header-simulator.h"

#define M_ZERO 0x0100
#define NULL ((void *)0)

void *malloc(size_t, void *, int);

struct test {
};

void foo(struct test *);

void test_zeroed() {
  struct test **list, *t;
  int i;

  list = malloc(sizeof(*list) * 10, NULL, M_ZERO);
  if (list == NULL)
    return;

  for (i = 0; i < 10; i++) {
    t = list[i];
    foo(t);
  }
  free(list); // no-warning
}

void test_nonzero() {
  struct test **list, *t;
  int i;

  list = malloc(sizeof(*list) * 10, NULL, 0);
  if (list == NULL)
    return;

  for (i = 0; i < 10; i++) {
    t = list[i]; // expected-warning{{undefined}}
    foo(t);
  }
  free(list);
}

void test_indeterminate(int flags) {
  struct test **list, *t;
  int i;

  list = malloc(sizeof(*list) * 10, NULL, flags);
  if (list == NULL)
    return;

  for (i = 0; i < 10; i++) {
    t = list[i]; // expected-warning{{undefined}}
    foo(t);
  }
  free(list);
}
