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