blob: a691f0bc803219ab85da602a367658314787286e [file] [log] [blame]
John McCallf85e1932011-06-15 23:02:42 +00001// RUN: %clang_cc1 -fobjc-nonfragile-abi -fsyntax-only -fobjc-arc -verify -Warc-abi -fblocks -triple x86_64-apple-darwin10.0.0 %s
2
3typedef __strong id strong_id;
4typedef __weak id weak_id;
5void test_pseudo_destructors(__strong id *sptr, __weak id *wptr) {
6 sptr->~id(); // okay
7 wptr->~id(); // okay
8 sptr->~strong_id(); // okay
9 wptr->~weak_id();
10 sptr->~weak_id(); // expected-error{{pseudo-destructor destroys object of type '__strong id' with inconsistently-qualified type 'weak_id' (aka '__weak id')}}
11 wptr->strong_id::~strong_id(); // expected-error{{pseudo-destructor destroys object of type '__weak id' with inconsistently-qualified type 'strong_id' (aka '__strong id')}}
12
13 sptr->id::~id(); // okay
14 wptr->id::~id(); // okay
15}
16
17void test_delete(__strong id *sptr, __weak id *wptr) {
18 delete sptr;
19 delete wptr;
20 delete [] sptr; // expected-warning{{destroying an array of '__strong id'; this array must not have been allocated from non-ARC code}}
21 delete [] wptr; // expected-warning{{destroying an array of '__weak id'; this array must not have been allocated from non-ARC code}}
22}
23
24void test_new(int n) {
25 (void)new strong_id;
26 (void)new weak_id;
27 (void)new strong_id [n]; // expected-warning{{allocating an array of 'strong_id' (aka '__strong id'); this array must not be deleted in non-ARC code}}
28 (void)new weak_id [n]; // expected-warning{{allocating an array of 'weak_id' (aka '__weak id'); this array must not be deleted in non-ARC code}}
29
30 (void)new __strong id;
31 (void)new __weak id;
32 (void)new __strong id [n]; // expected-warning{{allocating an array of '__strong id'; this array must not be deleted in non-ARC code}}
33
34 // Infer '__strong'.
35 __strong id *idptr = new id;
36 __strong id *idptr2 = new id [n]; // expected-warning{{allocating an array of '__strong id'; this array must not be deleted in non-ARC code}}
37
38 // ... but not for arrays.
39 typedef id id_array[2][3];
40 (void)new id_array; // expected-error{{'new' cannot allocate an array of 'id' with no explicit lifetime}}
41
42 typedef __strong id strong_id_array[2][3];
43 typedef __strong id strong_id_3[3];
44 strong_id_3 *idptr3 = new strong_id_array; // expected-warning{{allocating an array of '__strong id'; this array must not be deleted in non-ARC code}}
45}
46
47void test_jump_scope() {
48 goto done; // expected-error{{goto into protected scope}}
49 __strong id x; // expected-note{{jump bypasses initialization of retaining variable}}
50 done:
51 return;
52}