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