1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,debug.ExprInspection -analyzer-store=region -verify -Wno-objc-root-class %s |
2 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.RetainCount,debug.ExprInspection -analyzer-store=region -verify -Wno-objc-root-class -fobjc-arc %s |
3 | |
4 | void clang_analyzer_eval(bool); |
5 | void clang_analyzer_checkInlined(bool); |
6 | |
7 | @interface IntWrapper |
8 | @property (readonly) int &value; |
9 | @end |
10 | |
11 | @implementation IntWrapper |
12 | @synthesize value; |
13 | @end |
14 | |
15 | void testReferenceConsistency(IntWrapper *w) { |
16 | clang_analyzer_eval(w.value == w.value); // expected-warning{{TRUE}} |
17 | clang_analyzer_eval(&w.value == &w.value); // expected-warning{{TRUE}} |
18 | |
19 | if (w.value != 42) |
20 | return; |
21 | |
22 | clang_analyzer_eval(w.value == 42); // expected-warning{{TRUE}} |
23 | } |
24 | |
25 | void testReferenceAssignment(IntWrapper *w) { |
26 | w.value = 42; |
27 | clang_analyzer_eval(w.value == 42); // expected-warning{{TRUE}} |
28 | } |
29 | |
30 | |
31 | struct IntWrapperStruct { |
32 | int value; |
33 | }; |
34 | |
35 | @interface StructWrapper |
36 | @property IntWrapperStruct inner; |
37 | @end |
38 | |
39 | @implementation StructWrapper |
40 | @synthesize inner; |
41 | @end |
42 | |
43 | void testConsistencyStruct(StructWrapper *w) { |
44 | clang_analyzer_eval(w.inner.value == w.inner.value); // expected-warning{{TRUE}} |
45 | |
46 | int origValue = w.inner.value; |
47 | if (origValue != 42) |
48 | return; |
49 | |
50 | clang_analyzer_eval(w.inner.value == 42); // expected-warning{{TRUE}} |
51 | } |
52 | |
53 | |
54 | class CustomCopy { |
55 | public: |
56 | CustomCopy() : value(0) {} |
57 | CustomCopy(const CustomCopy &other) : value(other.value) { |
58 | clang_analyzer_checkInlined(true); // expected-warning{{TRUE}} |
59 | } |
60 | int value; |
61 | }; |
62 | |
63 | @interface CustomCopyWrapper |
64 | @property CustomCopy inner; |
65 | @end |
66 | |
67 | @implementation CustomCopyWrapper |
68 | //@synthesize inner; |
69 | @end |
70 | |
71 | void testConsistencyCustomCopy(CustomCopyWrapper *w) { |
72 | clang_analyzer_eval(w.inner.value == w.inner.value); // expected-warning{{TRUE}} |
73 | |
74 | int origValue = w.inner.value; |
75 | if (origValue != 42) |
76 | return; |
77 | |
78 | clang_analyzer_eval(w.inner.value == 42); // expected-warning{{TRUE}} |
79 | } |
80 | |