aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/Analysis/ivars.m33
1 files changed, 33 insertions, 0 deletions
diff --git a/test/Analysis/ivars.m b/test/Analysis/ivars.m
new file mode 100644
index 0000000000..cd01a2886a
--- /dev/null
+++ b/test/Analysis/ivars.m
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -fblocks -verify -Wno-objc-root-class %s
+
+void clang_analyzer_eval(int);
+
+@interface Root {
+@public
+ int uniqueID;
+}
+
+- (void)refreshID;
+@end
+
+void testInvalidation(Root *obj) {
+ int savedID = obj->uniqueID;
+ clang_analyzer_eval(savedID == obj->uniqueID); // expected-warning{{TRUE}}
+
+ [obj refreshID];
+ clang_analyzer_eval(savedID == obj->uniqueID); // expected-warning{{UNKNOWN}}
+}
+
+
+@interface Child : Root
+@end
+
+@implementation Child
+- (void)testSuperInvalidation {
+ int savedID = self->uniqueID;
+ clang_analyzer_eval(savedID == self->uniqueID); // expected-warning{{TRUE}}
+
+ [super refreshID];
+ clang_analyzer_eval(savedID == self->uniqueID); // expected-warning{{UNKNOWN}}
+}
+@end