1 // RUN: %clang_cc1 -fsyntax-only -verify %s
3 //===----------------------------------------------------------------------===//
4 // The following code is reduced using delta-debugging from
5 // Foundation.h (Mac OS X).
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 //===----------------------------------------------------------------------===//
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;
29 typedef const struct __CFString * CFStringRef;
30 extern void CFStringCreateWithFormat(CFStringRef format, ...) __attribute__((format(CFString, 1, 2)));
32 int printf(const char * restrict, ...) ;
34 //===----------------------------------------------------------------------===//
36 //===----------------------------------------------------------------------===//
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'}}
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}}
47 // <rdar://problem/7068334> - Catch use of long long with int arguments.
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'}}
54 // <rdar://problem/7697748>
56 NSLog(@"%@!"); // expected-warning{{more '%' conversions than data arguments}}
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