Home | History | Annotate | Download | only in SemaObjCXX
      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 
      3 typedef __strong id strong_id;
      4 typedef __weak id weak_id;
      5 void 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 
     17 void 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 
     24 void 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 
     47 void 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