1*67e74705SXin Li// RUN: %clang_cc1 -Wcstring-format-directive -verify -fsyntax-only %s 2*67e74705SXin Li// rdar://19904147 3*67e74705SXin Li 4*67e74705SXin Litypedef __builtin_va_list __darwin_va_list; 5*67e74705SXin Litypedef __builtin_va_list va_list; 6*67e74705SXin Li 7*67e74705SXin Liva_list argList; 8*67e74705SXin Li 9*67e74705SXin Litypedef const struct __CFString * CFStringRef; 10*67e74705SXin Litypedef struct __CFString * CFMutableStringRef; 11*67e74705SXin Litypedef const struct __CFAllocator * CFAllocatorRef; 12*67e74705SXin Li 13*67e74705SXin Li 14*67e74705SXin Litypedef const struct __CFDictionary * CFDictionaryRef; 15*67e74705SXin Li 16*67e74705SXin LiCFStringRef CFSTR ( const char *cStr ); 17*67e74705SXin Li 18*67e74705SXin Li 19*67e74705SXin Liextern 20*67e74705SXin LiCFStringRef CStringCreateWithFormat(CFAllocatorRef alloc, CFDictionaryRef formatOptions, const char* format, ...) __attribute__((format(os_trace, 3, 4))); 21*67e74705SXin Li 22*67e74705SXin Liextern 23*67e74705SXin LiCFStringRef CStringCreateWithFormatAndArguments(CFAllocatorRef alloc, CFDictionaryRef formatOptions, const char* format, va_list arguments) __attribute__((format(os_trace, 3, 0))); 24*67e74705SXin Li 25*67e74705SXin Liextern 26*67e74705SXin Livoid CStringAppendFormat(CFMutableStringRef theString, CFDictionaryRef formatOptions, const char* format, ...) __attribute__((format(os_trace, 3, 4))); 27*67e74705SXin Li 28*67e74705SXin Liextern 29*67e74705SXin Livoid CStringAppendFormatAndArguments(CFMutableStringRef theString, CFDictionaryRef formatOptions, const char* format, va_list arguments) __attribute__((format(os_trace, 3, 0))); 30*67e74705SXin Li 31*67e74705SXin Livoid Test1(va_list argList) { 32*67e74705SXin Li CFAllocatorRef alloc; 33*67e74705SXin Li CStringCreateWithFormatAndArguments (alloc, 0, "%s\n", argList); 34*67e74705SXin Li CStringAppendFormatAndArguments ((CFMutableStringRef)@"AAAA", 0, "Hello %s there %d\n", argList); 35*67e74705SXin Li CStringCreateWithFormatAndArguments (alloc, 0, "%c\n", argList); 36*67e74705SXin Li CStringAppendFormatAndArguments ((CFMutableStringRef)@"AAAA", 0, "%d\n", argList); 37*67e74705SXin Li} 38*67e74705SXin Li 39*67e74705SXin Liextern void MyOSLog(const char* format, ...) __attribute__((format(os_trace, 1, 2))); 40*67e74705SXin Liextern void MyFStringCreateWithFormat(const char *format, ...) __attribute__((format(os_trace, 1, 2))); 41*67e74705SXin Liextern void XMyOSLog(int, const char* format, ...) __attribute__((format(os_trace, 2, 3))); 42*67e74705SXin Liextern void os_trace(const char *format, ...) __attribute__((format(os_trace, 1, 2))); 43*67e74705SXin Li 44*67e74705SXin Livoid Test2() { 45*67e74705SXin Li MyOSLog("%s\n", "Hello"); 46*67e74705SXin Li 47*67e74705SXin Li MyFStringCreateWithFormat("%s", "Hello"); 48*67e74705SXin Li XMyOSLog(4, "%s\n", "Hello"); 49*67e74705SXin Li 50*67e74705SXin Li os_trace("testing %@, %s, %d, %@, %m", CFSTR("object"), "string", 3, "it"); // expected-warning {{format specifies type 'id' but the argument has type 'char *'}} 51*67e74705SXin Li 52*67e74705SXin Li os_trace("testing %@, %s, %d, %@, %m", CFSTR("object"), "string", 3, @"ok"); 53*67e74705SXin Li} 54*67e74705SXin Li 55