diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-01-25 00:04:09 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-01-25 00:04:09 +0000 |
commit | 9b1f3d46d0f329e9ee22093067fd6ebb444cd0f3 (patch) | |
tree | f03652ddbd15fde32f4b8201dcad727a3e4c4804 | |
parent | 086cbfac7d64c0eda7ff080ad5c2ccce3d233ab4 (diff) | |
download | bcm5719-llvm-9b1f3d46d0f329e9ee22093067fd6ebb444cd0f3.tar.gz bcm5719-llvm-9b1f3d46d0f329e9ee22093067fd6ebb444cd0f3.zip |
Fix NSLog format string checking for %@.
llvm-svn: 148885
-rw-r--r-- | clang/lib/Analysis/FormatString.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Analysis/PrintfFormatString.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaObjC/format-strings-objc.m | 7 |
3 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/Analysis/FormatString.cpp b/clang/lib/Analysis/FormatString.cpp index a4d97fd90af..a0633c80d3c 100644 --- a/clang/lib/Analysis/FormatString.cpp +++ b/clang/lib/Analysis/FormatString.cpp @@ -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!"); diff --git a/clang/lib/Analysis/PrintfFormatString.cpp b/clang/lib/Analysis/PrintfFormatString.cpp index dbe73c8f83d..e5566f1411f 100644 --- a/clang/lib/Analysis/PrintfFormatString.cpp +++ b/clang/lib/Analysis/PrintfFormatString.cpp @@ -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; } diff --git a/clang/test/SemaObjC/format-strings-objc.m b/clang/test/SemaObjC/format-strings-objc.m index 3fb7c9e4351..a2fe841ced2 100644 --- a/clang/test/SemaObjC/format-strings-objc.m +++ b/clang/test/SemaObjC/format-strings-objc.m @@ -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')}} +} + |