1*67e74705SXin Li// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -verify %s 2*67e74705SXin Li 3*67e74705SXin Li#if __has_feature(arc_cf_code_audited) 4*67e74705SXin Lichar _global[-1]; // expected-error {{declared as an array with a negative size}} 5*67e74705SXin Li#endif 6*67e74705SXin Li 7*67e74705SXin Litypedef const void *CFTypeRef; 8*67e74705SXin LiCFTypeRef CFBridgingRetain(id X); 9*67e74705SXin Liid CFBridgingRelease(CFTypeRef); 10*67e74705SXin Litypedef const struct __CFString *CFStringRef; 11*67e74705SXin Li 12*67e74705SXin Liextern CFStringRef CFMakeString0(void); 13*67e74705SXin Li#pragma clang arc_cf_code_audited begin 14*67e74705SXin Liextern CFStringRef CFCreateString0(void); 15*67e74705SXin Li#pragma clang arc_cf_code_audited end 16*67e74705SXin Livoid test0() { 17*67e74705SXin Li id x; 18*67e74705SXin Li x = (id) CFMakeString0(); // expected-error {{requires a bridged cast}} expected-note {{__bridge to convert directly}} expected-note {{CFBridgingRelease call to transfer}} 19*67e74705SXin Li x = (id) CFCreateString0(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}} 20*67e74705SXin Li} 21*67e74705SXin Li 22*67e74705SXin Liextern CFStringRef CFMakeString1(void) __attribute__((cf_returns_not_retained)); 23*67e74705SXin Liextern CFStringRef CFCreateString1(void) __attribute__((cf_returns_retained)); 24*67e74705SXin Livoid test1() { 25*67e74705SXin Li id x; 26*67e74705SXin Li x = (id) CFMakeString1(); 27*67e74705SXin Li x = (id) CFCreateString1(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}} 28*67e74705SXin Li} 29*67e74705SXin Li 30*67e74705SXin Li#define CF_AUDIT_BEGIN _Pragma("clang arc_cf_code_audited begin") 31*67e74705SXin Li#define CF_AUDIT_END _Pragma("clang arc_cf_code_audited end") 32*67e74705SXin Li#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) 33*67e74705SXin Li#define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained)) 34*67e74705SXin Li 35*67e74705SXin LiCF_AUDIT_BEGIN 36*67e74705SXin Liextern CFStringRef CFMakeString2(void); 37*67e74705SXin Liextern CFStringRef CFCreateString2(void) CF_RETURNS_NOT_RETAINED; 38*67e74705SXin Liextern CFStringRef CFMakeString3(void) CF_RETURNS_RETAINED; 39*67e74705SXin Liextern CFStringRef CFCreateString3(void); 40*67e74705SXin LiCF_AUDIT_END 41*67e74705SXin Livoid test2() { 42*67e74705SXin Li id x; 43*67e74705SXin Li x = (id) CFMakeString2(); 44*67e74705SXin Li x = (id) CFCreateString2(); 45*67e74705SXin Li x = (id) CFMakeString3(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}} 46*67e74705SXin Li x = (id) CFCreateString3(); // expected-error {{requires a bridged cast}} expected-note {{CFBridgingRelease call to transfer}} 47*67e74705SXin Li} 48*67e74705SXin Li 49*67e74705SXin Li// rdar://14569171 50*67e74705SXin Li@interface NSString @end 51*67e74705SXin Litypedef signed int SInt32; 52*67e74705SXin Li#pragma clang arc_cf_code_audited begin 53*67e74705SXin Liextern SInt32 CFStringGetIntValue(CFStringRef str); // expected-note {{passing argument to parameter 'str' here}} 54*67e74705SXin Li#pragma clang arc_cf_code_audited end 55*67e74705SXin Li 56*67e74705SXin Livoid test3() { 57*67e74705SXin Li NSString* answer = @"42"; 58*67e74705SXin Li int ans = CFStringGetIntValue(answer); // expected-error {{incompatible pointer types passing retainable parameter of type 'NSString *__strong'to a CF function expecting 'CFStringRef'}} 59*67e74705SXin Li} 60