blob: 5e9f1bcb836cf2d405435ca27be2ae749b794cd5 [file] [log] [blame]
Anna Zaks2b687612013-02-07 23:05:37 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
2
3void clang_analyzer_eval(int);
4
5void use(int);
6id foo(int x) {
7 if (x)
8 return 0;
9 static id p = foo(1);
10 clang_analyzer_eval(p == 0); // expected-warning{{TRUE}}
11 return p;
Jordan Rosefbdbed32013-02-25 19:45:34 +000012}
13
Jordan Rosef8e2c062013-03-20 20:36:01 +000014const int &globalIntRef = 42;
Jordan Rosefbdbed32013-02-25 19:45:34 +000015
Jordan Rosef8e2c062013-03-20 20:36:01 +000016void testGlobalRef() {
Jordan Rosefbdbed32013-02-25 19:45:34 +000017 // FIXME: Should be TRUE, but should at least not crash.
Jordan Rosef8e2c062013-03-20 20:36:01 +000018 clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}}
19}
20
21extern int globalInt;
Jordan Rosee0208ff2013-04-15 20:39:41 +000022extern struct {
23 int value;
24} globalStruct;
Jordan Rosef8e2c062013-03-20 20:36:01 +000025extern void invalidateGlobals();
26
27void testGlobalInvalidation() {
Jordan Rosee0208ff2013-04-15 20:39:41 +000028 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
29 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
30
Jordan Rosef8e2c062013-03-20 20:36:01 +000031 if (globalInt != 42)
32 return;
Jordan Rosee0208ff2013-04-15 20:39:41 +000033 if (globalStruct.value != 43)
34 return;
Jordan Rosef8e2c062013-03-20 20:36:01 +000035 clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
Jordan Rosee0208ff2013-04-15 20:39:41 +000036 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
Jordan Rosef8e2c062013-03-20 20:36:01 +000037
38 invalidateGlobals();
Jordan Rosefbdbed32013-02-25 19:45:34 +000039 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
Jordan Rosee0208ff2013-04-15 20:39:41 +000040 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
Jordan Rosefbdbed32013-02-25 19:45:34 +000041}
Jordan Rosef8e2c062013-03-20 20:36:01 +000042
Jordan Rosef8e2c062013-03-20 20:36:01 +000043void testGlobalInvalidationWithDirectBinding() {
Jordan Rosee0208ff2013-04-15 20:39:41 +000044 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
45 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
46
Jordan Rosef8e2c062013-03-20 20:36:01 +000047 globalInt = 42;
Jordan Rosee0208ff2013-04-15 20:39:41 +000048 globalStruct.value = 43;
Jordan Rosef8e2c062013-03-20 20:36:01 +000049 clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
Jordan Rosee0208ff2013-04-15 20:39:41 +000050 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
Jordan Rosef8e2c062013-03-20 20:36:01 +000051
52 invalidateGlobals();
Jordan Rosee0208ff2013-04-15 20:39:41 +000053 clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
54 clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
Jordan Rosef8e2c062013-03-20 20:36:01 +000055}