]> git.proxmox.com Git - rustc.git/blob - src/llvm/tools/clang/test/Analysis/objc-subscript.m
Imported Upstream version 0.6
[rustc.git] / src / llvm / tools / clang / test / Analysis / objc-subscript.m
1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -verify -Wno-objc-root-class %s
2
3 typedef signed char BOOL;
4 typedef unsigned int NSUInteger;
5
6 @interface NSObject
7 +(id)alloc;
8 -(id)init;
9 -(id)autorelease;
10 -(id)copy;
11 -(id)retain;
12 @end
13
14 @interface Subscriptable : NSObject
15 - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index;
16 - (id)objectAtIndexedSubscript:(NSUInteger)index;
17
18 - (void)setObject:(id)obj forKeyedSubscript:(id)key;
19 - (id)objectForKeyedSubscript:(id)key;
20 @end
21
22 @interface Test : Subscriptable
23 @end
24
25 @implementation Test
26
27 // <rdar://problem/6946338> for subscripting
28 - (id)storeDoesNotRetain {
29 Test *cell = [[[Test alloc] init] autorelease];
30
31 NSObject *string1 = [[NSObject alloc] init]; // expected-warning {{Potential leak}}
32 cell[0] = string1;
33 cell[self] = string1;
34 cell[string1] = self;
35
36 return cell;
37 }
38
39 // <rdar://problem/8824416> for subscripting
40 - (id)getDoesNotRetain:(BOOL)keyed {
41 if (keyed)
42 return [self[self] autorelease]; // expected-warning{{Object sent -autorelease too many times}}
43 else
44 return [self[0] autorelease]; // expected-warning{{Object sent -autorelease too many times}}
45 }
46
47 // <rdar://problem/9241180> for subscripting
48 - (id)testUninitializedObject:(BOOL)keyed {
49 Test *o;
50 if (keyed) {
51 if (o[self]) // expected-warning {{Subscript access on an uninitialized object pointer}}
52 return o; // no-warning (sink)
53 } else {
54 if (o[0]) // expected-warning {{Subscript access on an uninitialized object pointer}}
55 return o; // no-warning (sink)
56 }
57 return self;
58 }
59
60 - (void)testUninitializedArgument:(id)input testCase:(unsigned)testCase {
61 NSUInteger i;
62 id o;
63
64 switch (testCase) {
65 case 0:
66 self[0] = o; // expected-warning {{Argument for subscript setter is an uninitialized value}}
67 break;
68 case 1:
69 self[i] = input; // expected-warning {{Subscript index is an uninitialized value}}
70 break;
71 case 2:
72 (void)self[i]; // expected-warning {{Subscript index is an uninitialized value}}
73 break;
74 case 3:
75 self[input] = o; // expected-warning {{Argument for subscript setter is an uninitialized value}}
76 break;
77 case 4:
78 self[o] = input; // expected-warning {{Subscript index is an uninitialized value}}
79 break;
80 case 5:
81 (void)self[o]; // expected-warning {{Subscript index is an uninitialized value}}
82 break;
83 default:
84 break;
85 }
86
87 }
88
89 @end