[analyzer] ObjC Inlining: add tests for ivars and properties.

TODO:
 - Handle @syncronized properties.
 - Always inline properties declared publicly (do not split the path).
This is tricky since there is no mapping from a Decl to the property in
the AST as far as I can tell.

llvm-svn: 161683
This commit is contained in:
Anna Zaks 2012-08-10 18:56:01 +00:00
parent 75f49a9c07
commit d4e65373f3
2 changed files with 91 additions and 2 deletions

View File

@ -11,10 +11,35 @@
}
@end
@interface PublicClass () {
int value2;
}
@property (readwrite) int value1;
- (void)setValue2:(int)newValue2;
@end
@implementation PublicClass
- (int)getZeroPublic {
return 0;
}
@synthesize value1;
- (int)value2 {
return value2;
}
- (void)setValue2:(int)newValue {
value2 = newValue;
}
- (int)value3 {
return value3;
}
- (void)setValue3:(int)newValue {
value3 = newValue;
}
@end
@interface MyClassWithPublicParent : PublicClass
@ -37,8 +62,11 @@
@end
@interface MyClass : MyParent
@interface MyClass : MyParent {
int value;
}
- (int)getZero;
@property int value;
@end
// Since class is private, we assume that it cannot be subclassed.
@ -66,6 +94,33 @@
- (int)getZero {
return 1;
}
- (int)value {
return value;
}
- (void)setValue:(int)newValue {
value = newValue;
}
// Test ivar access.
- (int) testIvarInSelf {
value = 0;
return 5/value; // expected-warning {{Division by zero}}
}
+ (int) testIvar: (MyClass*) p {
p.value = 0;
return 5/p.value; // expected-warning {{Division by zero}}
}
// Test simple property access.
+ (int) testProperty: (MyClass*) p {
int x= 0;
[p setValue:0];
return 5/[p value]; // expected-warning {{Division by zero}}
}
@end
// The class is prvate and is not subclassed.
@ -100,3 +155,27 @@ int testCallToPublicAPICat(PublicSubClass *p) {
return 5/m; // expected-warning {{Division by zero}}
return 5/[p getZeroPublic];// expected-warning {{Division by zero}}
}
// Test public property - properties should always be inlined, regardless
// weither they are "public" or private.
int testPublicProperty(PublicClass *p) {
int x = 0;
[p setValue3:0];
if ([p value3] != 0)
return 5/x; // expected-warning {{Division by zero}} // TODO: no warning, we should always inline the property.
return 5/[p value3];// expected-warning {{Division by zero}}
}
int testExtension(PublicClass *p) {
int x = 0;
[p setValue2:0];
if ([p value2] != 0)
return 5/x; // expected-warning {{Division by zero}} // TODO: no warning, we should always inline the property.
return 5/[p value2]; // expected-warning {{Division by zero}}
}
// TODO: we do not handle synthesized properties yet.
int testPropertySynthesized(PublicClass *p) {
[p setValue1:0];
return 5/[p value1];
}

View File

@ -19,8 +19,18 @@ typedef struct objc_object {
-(id)retain;
@end
@interface PublicClass : NSObject
@interface PublicClass : NSObject {
int value3;
}
- (int)getZeroPublic;
- (int) value2;
@property (readonly) int value1;
@property int value3;
- (int)value3;
- (void)setValue3:(int)newValue;
@end
@interface PublicSubClass : PublicClass