1*67e74705SXin Li // RUN: %clang_cc1 -Wno-pointer-bool-conversion -analyze -analyzer-checker=core,debug.ExprInspection -verify %s 2*67e74705SXin Li 3*67e74705SXin Li void clang_analyzer_eval(int); 4*67e74705SXin Li testAnd(int i,int * p)5*67e74705SXin Livoid testAnd(int i, int *p) { 6*67e74705SXin Li int *nullP = 0; 7*67e74705SXin Li int *knownP = &i; 8*67e74705SXin Li clang_analyzer_eval((knownP && knownP) == 1); // expected-warning{{TRUE}} 9*67e74705SXin Li clang_analyzer_eval((knownP && nullP) == 0); // expected-warning{{TRUE}} 10*67e74705SXin Li clang_analyzer_eval((knownP && p) == 1); // expected-warning{{UNKNOWN}} 11*67e74705SXin Li } 12*67e74705SXin Li testOr(int i,int * p)13*67e74705SXin Livoid testOr(int i, int *p) { 14*67e74705SXin Li int *nullP = 0; 15*67e74705SXin Li int *knownP = &i; 16*67e74705SXin Li clang_analyzer_eval((nullP || knownP) == 1); // expected-warning{{TRUE}} 17*67e74705SXin Li clang_analyzer_eval((nullP || nullP) == 0); // expected-warning{{TRUE}} 18*67e74705SXin Li clang_analyzer_eval((nullP || p) == 1); // expected-warning{{UNKNOWN}} 19*67e74705SXin Li } 20*67e74705SXin Li 21*67e74705SXin Li 22*67e74705SXin Li // PR13461 testTypeIsInt(int i,void * p)23*67e74705SXin Liint testTypeIsInt(int i, void *p) { 24*67e74705SXin Li if (i | (p && p)) 25*67e74705SXin Li return 1; 26*67e74705SXin Li return 0; 27*67e74705SXin Li } 28*67e74705SXin Li 29*67e74705SXin Li // These crashed the analyzer at some point. between(char * x)30*67e74705SXin Liint between(char *x) { 31*67e74705SXin Li extern char start[]; 32*67e74705SXin Li extern char end[]; 33*67e74705SXin Li return x >= start && x < end; 34*67e74705SXin Li } 35*67e74705SXin Li undef(void)36*67e74705SXin Liint undef(void) {} // expected-warning{{control reaches end of non-void function}} useUndef(void)37*67e74705SXin Livoid useUndef(void) { 0 || undef(); } 38*67e74705SXin Li testPointer(void)39*67e74705SXin Livoid testPointer(void) { (void) (1 && testPointer && 0); } 40