• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// RUN: %clang_cc1 -fobjc-runtime-has-weak -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 ownership}}
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}
53