global_region_invalidation.mm revision e0208ff84598f48e0aafecf5b543afeff8574045
1// 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;
12}
13
14const int &globalIntRef = 42;
15
16void testGlobalRef() {
17  // FIXME: Should be TRUE, but should at least not crash.
18  clang_analyzer_eval(globalIntRef == 42); // expected-warning{{UNKNOWN}}
19}
20
21extern int globalInt;
22extern struct {
23  int value;
24} globalStruct;
25extern void invalidateGlobals();
26
27void testGlobalInvalidation() {
28  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
29  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
30
31  if (globalInt != 42)
32    return;
33  if (globalStruct.value != 43)
34    return;
35  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
36  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
37
38  invalidateGlobals();
39  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
40  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
41}
42
43void testGlobalInvalidationWithDirectBinding() {
44  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
45  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
46
47  globalInt = 42;
48  globalStruct.value = 43;
49  clang_analyzer_eval(globalInt == 42); // expected-warning{{TRUE}}
50  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{TRUE}}
51
52  invalidateGlobals();
53  clang_analyzer_eval(globalInt == 42); // expected-warning{{UNKNOWN}}
54  clang_analyzer_eval(globalStruct.value == 43); // expected-warning{{UNKNOWN}}
55}
56