From 5498e3a01be0446f38c102278847566176f6507f Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Fri, 10 Aug 2012 18:56:01 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161683 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Analysis/inlining/DynDispatchBifurcate.m | 81 ++++++++++++++++++- .../inlining/InlineObjCInstanceMethod.h | 12 ++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/test/Analysis/inlining/DynDispatchBifurcate.m b/test/Analysis/inlining/DynDispatchBifurcate.m index 2a690a5e62..e78b90bb8c 100644 --- a/test/Analysis/inlining/DynDispatchBifurcate.m +++ b/test/Analysis/inlining/DynDispatchBifurcate.m @@ -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]; +} diff --git a/test/Analysis/inlining/InlineObjCInstanceMethod.h b/test/Analysis/inlining/InlineObjCInstanceMethod.h index 715b89eff8..bb0da280c8 100644 --- a/test/Analysis/inlining/InlineObjCInstanceMethod.h +++ b/test/Analysis/inlining/InlineObjCInstanceMethod.h @@ -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 -- 2.40.0