// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -analyzer-config eagerly-assume=false  -analyzer-checker=core.uninitialized.Assign,debug.ExprInspection -verify %s

void clang_analyzer_eval(int);

void initbug(void) {
  const union { float a; } u = {};
  (void)u.a; // no-crash
}

int const parr[2] = {1};
void constarr(void) {
  int i = 2;
  clang_analyzer_eval(parr[i]); // expected-warning{{UNDEFINED}}
  i = 1;
  clang_analyzer_eval(parr[i] == 0); // expected-warning{{TRUE}}
  i = -1;
  clang_analyzer_eval(parr[i]); // expected-warning{{UNDEFINED}}
}

struct SM {
  int a;
  int b;
};
const struct SM sm = {.a = 1};
void multinit(void) {
  clang_analyzer_eval(sm.a == 1); // expected-warning{{TRUE}}
  clang_analyzer_eval(sm.b == 0); // expected-warning{{TRUE}}
}

const int glob_arr1[6] = {[2] = 3, [0] = 1, [1] = 2, [3] = 4};
void glob_array_index1(void) {
  clang_analyzer_eval(glob_arr1[0] == 1); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr1[1] == 2); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr1[2] == 3); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr1[3] == 4); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr1[4] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr1[5] == 0); // expected-warning{{TRUE}}
}

void glob_array_index2(void) {
  const int *ptr = glob_arr1;
  clang_analyzer_eval(ptr[0] == 1); // expected-warning{{TRUE}}
  clang_analyzer_eval(ptr[1] == 2); // expected-warning{{TRUE}}
  clang_analyzer_eval(ptr[2] == 3); // expected-warning{{TRUE}}
  clang_analyzer_eval(ptr[3] == 4); // expected-warning{{TRUE}}
  clang_analyzer_eval(ptr[4] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(ptr[5] == 0); // expected-warning{{TRUE}}
}

void glob_invalid_index1(void) {
  int x = -42;
  int res = glob_arr1[x]; // expected-warning{{uninitialized}}
}

void glob_invalid_index2(void) {
  const int *ptr = glob_arr1;
  int x = 42;
  int res = ptr[x]; // expected-warning{{uninitialized}}
}

const int glob_arr2[3][3] = {[0][0] = 1, [1][1] = 5, [2][0] = 7};
void glob_arr_index3(void) {
  clang_analyzer_eval(glob_arr2[0][0] == 1); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[0][1] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[0][2] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[1][0] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[1][1] == 5); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[1][2] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[2][0] == 7); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[2][1] == 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr2[2][2] == 0); // expected-warning{{TRUE}}
}

void negative_index(void) {
  int x = 2, y = -2;
  clang_analyzer_eval(glob_arr2[x][y] == 5); // expected-warning{{UNDEFINED}}
  x = 3;
  y = -3;
  clang_analyzer_eval(glob_arr2[x][y] == 7); // expected-warning{{UNDEFINED}}
}

void glob_invalid_index3(void) {
  int x = -1, y = -1;
  int res = glob_arr2[x][y]; // expected-warning{{uninitialized}}
}

void glob_invalid_index4(void) {
  int x = 3, y = 2;
  int res = glob_arr2[x][y]; // expected-warning{{uninitialized}}
}

const int glob_arr_no_init[10];
void glob_arr_index4(void) {
  // FIXME: Should warn {{FALSE}}, since the array has a static storage.
  clang_analyzer_eval(glob_arr_no_init[2]); // expected-warning{{UNKNOWN}}
}

const int glob_arr3[];              // IncompleteArrayType
const int glob_arr3[4] = {1, 2, 3}; // ConstantArrayType
void glob_arr_index5(void) {
  clang_analyzer_eval(glob_arr3[0] == 1); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr3[1] == 2); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr3[2] == 3); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr3[3] == 0); // expected-warning{{TRUE}}
}

void glob_invalid_index5(void) {
  int x = 42;
  int res = glob_arr3[x]; // expected-warning{{uninitialized}}
}

void glob_invalid_index6(void) {
  int x = -42;
  int res = glob_arr3[x]; // expected-warning{{uninitialized}}
}

const int glob_arr4[];              // IncompleteArrayType
const int glob_arr4[4] = {1, 2, 3}; // ConstantArrayType
const int glob_arr4[];              // ConstantArrayType (according to AST)
void glob_arr_index6(void) {
  clang_analyzer_eval(glob_arr4[0] == 1); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr4[1] == 2); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr4[2] == 3); // expected-warning{{TRUE}}
  clang_analyzer_eval(glob_arr4[3] == 0); // expected-warning{{TRUE}}
}

void glob_invalid_index7(void) {
  int x = 42;
  int res = glob_arr4[x]; // expected-warning{{uninitialized}}
}

void glob_invalid_index8(void) {
  int x = -42;
  int res = glob_arr4[x]; // expected-warning{{uninitialized}}
}
