Home | History | Annotate | Download | only in ARCMT
      1 // RUN: %clang_cc1 -arcmt-check -verify -triple x86_64-apple-darwin10 -fsyntax-only -fblocks %s
      2 
      3 // Classes that have an Objective-C object pointer.
      4 struct HasObjectMember0 {
      5   id x;
      6 };
      7 
      8 struct HasObjectMember1 {
      9   id x[3];
     10 };
     11 
     12 struct HasObjectMember2 {
     13   id x[3][2];
     14 };
     15 
     16 // Don't complain if the type has non-external linkage
     17 namespace {
     18   struct HasObjectMember3 {
     19     id x[3][2];
     20   };
     21 }
     22 
     23 // Don't complain if the Objective-C pointer type was explicitly given
     24 // no lifetime.
     25 struct HasObjectMember3 { 
     26   __unsafe_unretained id x[3][2];
     27 };
     28 
     29 struct HasBlockPointerMember0 {
     30   int (^bp)(int);
     31 };
     32 
     33 struct HasBlockPointerMember1 {
     34   int (^bp[2][3])(int);
     35 };
     36 
     37 struct NonPOD {
     38   NonPOD(const NonPOD&);
     39 };
     40 
     41 struct HasObjectMemberAndNonPOD0 {
     42   id x;
     43   NonPOD np;
     44 };
     45 
     46 struct HasObjectMemberAndNonPOD1 {
     47   NonPOD np;
     48   id x[3];
     49 };
     50 
     51 struct HasObjectMemberAndNonPOD2 {
     52   NonPOD np;
     53   id x[3][2];
     54 };
     55 
     56 struct HasObjectMemberAndNonPOD3 {
     57   HasObjectMemberAndNonPOD3 &operator=(const HasObjectMemberAndNonPOD3&);
     58   ~HasObjectMemberAndNonPOD3();
     59   NonPOD np;
     60   id x[3][2];
     61 };
     62 
     63 struct HasBlockPointerMemberAndNonPOD0 {
     64   NonPOD np;
     65   int (^bp)(int);
     66 };
     67 
     68 struct HasBlockPointerMemberAndNonPOD1 {
     69   NonPOD np;
     70   int (^bp[2][3])(int);
     71 };
     72 
     73 int check_non_pod_objc_pointer0[__is_pod(id)? 1 : -1];
     74 int check_non_pod_objc_pointer1[__is_pod(__strong id)? -1 : 1];
     75 int check_non_pod_objc_pointer2[__is_pod(__unsafe_unretained id)? 1 : -1];
     76 int check_non_pod_objc_pointer3[__is_pod(id[2][3])? 1 : -1];
     77 int check_non_pod_objc_pointer4[__is_pod(__unsafe_unretained id[2][3])? 1 : -1];
     78 int check_non_pod_block0[__is_pod(int (^)(int))? 1 : -1];
     79 int check_non_pod_block1[__is_pod(int (^ __unsafe_unretained)(int))? 1 : -1];
     80 
     81 struct FlexibleArrayMember0 {
     82   int length;
     83   id array[]; // expected-error{{flexible array member 'array' of type 'id __strong[]' with non-trivial destruction}}
     84 };
     85 
     86 struct FlexibleArrayMember1 {
     87   int length;
     88   __unsafe_unretained id array[];
     89 };
     90 
     91 // It's okay to pass a retainable type through an ellipsis.
     92 void variadic(...);
     93 void test_variadic() {
     94   variadic(1, 17, @"Foo");
     95 }
     96 
     97 // It's okay to create a VLA of retainable types.
     98 void vla(int n) {
     99   id vla[n];
    100 }
    101