]> granicus.if.org Git - clang/commitdiff
Fix NSLog format string checking for %@.
authorTed Kremenek <kremenek@apple.com>
Wed, 25 Jan 2012 00:04:09 +0000 (00:04 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 25 Jan 2012 00:04:09 +0000 (00:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148885 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/FormatString.cpp
lib/Analysis/PrintfFormatString.cpp
test/SemaObjC/format-strings-objc.m

index a4d97fd90af84333939b670083832c94b484083f..a0633c80d3c5c57a96ac2ee1aebb07b6551fb08b 100644 (file)
@@ -337,7 +337,8 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const {
         argTy->isNullPtrType();
 
     case ObjCPointerTy:
-      return argTy->getAs<ObjCObjectPointerType>() != NULL;
+      return argTy->getAs<ObjCObjectPointerType>() ||
+             argTy->getAs<BlockPointerType>();
   }
 
   llvm_unreachable("Invalid ArgTypeResult Kind!");
index dbe73c8f83d7df7fe948427bf3a9ae6210bbfa8a..e5566f1411fcbbf72dea13945997e17528c8ea9f 100644 (file)
@@ -319,6 +319,8 @@ ArgTypeResult PrintfSpecifier::getArgType(ASTContext &Ctx) const {
       return ArgTypeResult(Ctx.WCharTy, "wchar_t");
     case ConversionSpecifier::pArg:
       return ArgTypeResult::CPointerTy;
+    case ConversionSpecifier::ObjCObjArg:
+      return ArgTypeResult::ObjCPointerTy;
     default:
       break;
   }
index 3fb7c9e435190a7c0cf57f90fb357e3c6a6bfe4d..a2fe841ced28fe5cd3a8ef47ce0f26f5816c96f2 100644 (file)
@@ -13,6 +13,7 @@ typedef signed char BOOL;
 typedef unsigned int NSUInteger;
 @class NSString, Protocol;
 extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));
+extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2)));
 typedef struct _NSZone NSZone;
 @class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
 @protocol NSObject  - (BOOL)isEqual:(id)object; @end
@@ -82,3 +83,9 @@ void check_method() {
   [Foo fooWithFormat:@"%@"]; // expected-warning {{more '%' conversions than data arguments}}
   [Foo fooWithCStringFormat:"%@"]; // expected-warning {{invalid conversion specifier '@'}}
 }
+
+// Warn about using BOOL with %@
+void rdar10743758(id x) {
+  NSLog(@"%@ %@", x, (BOOL) 1); // expected-warning {{format specifies type 'id' but the argument has type 'BOOL' (aka 'signed char')}}
+}
+