17f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
27f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose
37f839a6b35e5007964b538423b0a570eed26fc10Jordan Rosevoid clang_analyzer_eval(int);
47f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose
57f839a6b35e5007964b538423b0a570eed26fc10Jordan Rosevoid testAnd(int i, int *p) {
67f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  int *nullP = 0;
77f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  int *knownP = &i;
87f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  clang_analyzer_eval((knownP && knownP) == 1); // expected-warning{{TRUE}}
97f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  clang_analyzer_eval((knownP && nullP) == 0); // expected-warning{{TRUE}}
107f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  clang_analyzer_eval((knownP && p) == 1); // expected-warning{{UNKNOWN}}
117f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose}
127f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose
137f839a6b35e5007964b538423b0a570eed26fc10Jordan Rosevoid testOr(int i, int *p) {
147f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  int *nullP = 0;
157f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  int *knownP = &i;
167f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  clang_analyzer_eval((nullP || knownP) == 1); // expected-warning{{TRUE}}
177f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  clang_analyzer_eval((nullP || nullP) == 0); // expected-warning{{TRUE}}
187f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  clang_analyzer_eval((nullP || p) == 1); // expected-warning{{UNKNOWN}}
197f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose}
207f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose
217f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose
227f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose// PR13461
237f839a6b35e5007964b538423b0a570eed26fc10Jordan Roseint testTypeIsInt(int i, void *p) {
247f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  if (i | (p && p))
257f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose    return 1;
267f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose  return 0;
277f839a6b35e5007964b538423b0a570eed26fc10Jordan Rose}
286a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath
296a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath// These crashed the analyzer at some point.
306a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labathint between(char *x) {
316a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath  extern char start[];
326a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath  extern char end[];
336a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath  return x >= start && x < end;
346a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath}
356a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath
366a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labathint undef(void) {} // expected-warning{{control reaches end of non-void function}}
376a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labathvoid useUndef(void) { 0 || undef(); }
386a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labath
396a556a42d48cc098fb8dcb5d4ecdd0e03e32c0ecPavel Labathvoid testPointer(void) { (void) (1 && testPointer && 0); }
40