1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 //===----------------------------------------------------------------------===// 4 // The following code is reduced using delta-debugging from 5 // Foundation.h (Mac OS X). 6 // 7 // It includes the basic definitions for the test cases below. 8 // Not including Foundation.h directly makes this test case both svelt and 9 // portable to non-Mac platforms. 10 //===----------------------------------------------------------------------===// 11 12 typedef signed char BOOL; 13 typedef unsigned int NSUInteger; 14 @class NSString, Protocol; 15 extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); 16 typedef struct _NSZone NSZone; 17 @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator; 18 @protocol NSObject - (BOOL)isEqual:(id)object; @end 19 @protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end 20 @protocol NSMutableCopying - (id)mutableCopyWithZone:(NSZone *)zone; @end 21 @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end 22 @interface NSObject <NSObject> {} @end 23 typedef float CGFloat; 24 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding> - (NSUInteger)length; @end 25 @interface NSSimpleCString : NSString {} @end 26 @interface NSConstantString : NSSimpleCString @end 27 extern void *_NSConstantStringClassReference; 28 29 typedef const struct __CFString * CFStringRef; 30 extern void CFStringCreateWithFormat(CFStringRef format, ...) __attribute__((format(CFString, 1, 2))); 31 32 int printf(const char * restrict, ...) ; 33 34 //===----------------------------------------------------------------------===// 35 // Test cases. 36 //===----------------------------------------------------------------------===// 37 38 void check_nslog(unsigned k) { 39 NSLog(@"%d%%", k); // no-warning 40 NSLog(@"%s%lb%d", "unix", 10,20); // expected-warning {{invalid conversion specifier 'b'}} 41 } 42 43 // Check type validation 44 extern void NSLog2(int format, ...) __attribute__((format(__NSString__, 1, 2))); // expected-error {{format argument not an NSString}} 45 extern void CFStringCreateWithFormat2(int *format, ...) __attribute__((format(CFString, 1, 2))); // expected-error {{format argument not a CFString}} 46 47 // <rdar://problem/7068334> - Catch use of long long with int arguments. 48 void rdar_7068334() { 49 long long test = 500; 50 printf("%i ",test); // expected-warning{{conversion specifies type 'int' but the argument has type 'long long'}} 51 NSLog(@"%i ",test); // expected-warning{{conversion specifies type 'int' but the argument has type 'long long'}} 52 } 53 54 // <rdar://problem/7697748> 55 void rdar_7697748() { 56 NSLog(@"%@!"); // expected-warning{{more '%' conversions than data arguments}} 57 } 58 59 @protocol Foo; 60 61 void test_p_conversion_with_objc_pointer(id x, id<Foo> y) { 62 printf("%p", x); // no-warning 63 printf("%p", y); // no-warning 64 } 65 66