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