1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify %s 2*67e74705SXin Li 3*67e74705SXin Li void clang_analyzer_eval(int); 4*67e74705SXin Li void clang_analyzer_warnIfReached(); 5*67e74705SXin Li f(void)6*67e74705SXin Livoid f(void) { 7*67e74705SXin Li void (*p)(void); 8*67e74705SXin Li p = f; 9*67e74705SXin Li p = &f; 10*67e74705SXin Li p(); 11*67e74705SXin Li (*p)(); 12*67e74705SXin Li } 13*67e74705SXin Li 14*67e74705SXin Li void g(void (*fp)(void)); 15*67e74705SXin Li f2()16*67e74705SXin Livoid f2() { 17*67e74705SXin Li g(f); 18*67e74705SXin Li } 19*67e74705SXin Li f3(void (* f)(void),void (* g)(void))20*67e74705SXin Livoid f3(void (*f)(void), void (*g)(void)) { 21*67e74705SXin Li clang_analyzer_eval(!f); // expected-warning{{UNKNOWN}} 22*67e74705SXin Li f(); 23*67e74705SXin Li clang_analyzer_eval(!f); // expected-warning{{FALSE}} 24*67e74705SXin Li 25*67e74705SXin Li clang_analyzer_eval(!g); // expected-warning{{UNKNOWN}} 26*67e74705SXin Li (*g)(); 27*67e74705SXin Li clang_analyzer_eval(!g); // expected-warning{{FALSE}} 28*67e74705SXin Li } 29*67e74705SXin Li nullFunctionPointerConstant()30*67e74705SXin Livoid nullFunctionPointerConstant() { 31*67e74705SXin Li void (*f)(void) = 0; 32*67e74705SXin Li f(); // expected-warning{{Called function pointer is null}} 33*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 34*67e74705SXin Li } 35*67e74705SXin Li nullFunctionPointerConstraint(void (* f)(void))36*67e74705SXin Livoid nullFunctionPointerConstraint(void (*f)(void)) { 37*67e74705SXin Li if (f) 38*67e74705SXin Li return; 39*67e74705SXin Li f(); // expected-warning{{Called function pointer is null}} 40*67e74705SXin Li clang_analyzer_warnIfReached(); // no-warning 41*67e74705SXin Li } 42