Home | History | Annotate | Download | only in SemaObjC
      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