// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s

void clang_analyzer_eval(int);

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

void use(int);
id foo(int x) {
  if (x)
    return 0;
  static id p = foo(1); 
    clang_analyzer_eval(p == 0); // expected-warning{{TRUE}}
  return p;
}

const int &globalIntRef = 42;

void testGlobalRef() {
  // FIXME: Should be TRUE, but should at least not crash.
  clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}}
}

extern int globalInt;
struct IntWrapper {
  int value;
};
extern struct IntWrapper globalStruct;
extern void invalidateGlobals();

void testGlobalInvalidation() {
  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}

  if (globalInt != 42)
    return;
  if (globalStruct.value != 43)
    return;
  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}

  invalidateGlobals();
  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}

  // Repeat to make sure we don't get the /same/ new symbolic values.
  if (globalInt != 42)
    return;
  if (globalStruct.value != 43)
    return;
  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}

  invalidateGlobals();
  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
}

void testGlobalInvalidationWithDirectBinding() {
  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}

  globalInt = 42;
  globalStruct.value = 43;
  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}

  invalidateGlobals();
  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
}

void testStaticLocals(void) {
  static int i;
  int tmp;

  extern int someSymbolicValue();
  i = someSymbolicValue();

  if (i == 5) {
    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
    scanf("%d", &tmp);
    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
    invalidateGlobals();
    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
  }

  i = 6;
  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
  scanf("%d", &tmp);
  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
  invalidateGlobals();
  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}

  i = someSymbolicValue();
  if (i == 7) {
    clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
    scanf("%d", &i);
    clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
  }

  i = 8;
  clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
  scanf("%d", &i);
  clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
}

void testNonSystemGlobals(void) {
  extern int i;
  int tmp;

  if (i == 5) {
    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
    scanf("%d", &tmp);
    clang_analyzer_eval(i == 5); // expected-warning{{TRUE}}
    invalidateGlobals();
    clang_analyzer_eval(i == 5); // expected-warning{{UNKNOWN}}
  }

  i = 6;
  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
  scanf("%d", &tmp);
  clang_analyzer_eval(i == 6); // expected-warning{{TRUE}}
  invalidateGlobals();
  clang_analyzer_eval(i == 6); // expected-warning{{UNKNOWN}}

  if (i == 7) {
    clang_analyzer_eval(i == 7); // expected-warning{{TRUE}}
    scanf("%d", &i);
    clang_analyzer_eval(i == 7); // expected-warning{{UNKNOWN}}
  }

  i = 8;
  clang_analyzer_eval(i == 8); // expected-warning{{TRUE}}
  scanf("%d", &i);
  clang_analyzer_eval(i == 8); // expected-warning{{UNKNOWN}}
}

void testWrappedGlobals(void) {
  extern char c;
  SomeStruct s;

  if (c == 'C') {
    s.p = &c;
    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    fakeSystemHeaderCall(0);
    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    fakeSystemHeaderCall(&s);
    clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
  }

  c = 'c';
  s.p = &c;
  clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
  fakeSystemHeaderCall(0);
  clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
  fakeSystemHeaderCall(&s);
  clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}

  if (c == 'C') {
    s.p = &c;
    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    fakeSystemHeaderCall(0);
    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    fakeSystemHeaderCall(&s);
    clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
  }
}

void testWrappedStaticsViaGlobal(void) {
  static char c;
  extern SomeStruct s;

  extern char getSomeChar();
  c = getSomeChar();

  if (c == 'C') {
    s.p = &c;
    clang_analyzer_eval(c == 'C'); // expected-warning{{TRUE}}
    invalidateGlobals();
    clang_analyzer_eval(c == 'C'); // expected-warning{{UNKNOWN}}
  }

  c = 'c';
  s.p = &c;
  clang_analyzer_eval(c == 'c'); // expected-warning{{TRUE}}
  invalidateGlobals();
  clang_analyzer_eval(c == 'c'); // expected-warning{{UNKNOWN}}
}
