From d22b98aad24577c224813c0a301affa9fae8e57f Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Mon, 6 Feb 2012 21:45:29 +0000 Subject: Tweak format string checking to work with %@ and ObjC toll-free bridging. llvm-svn: 149907 --- clang/lib/Analysis/FormatString.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'clang/lib/Analysis/FormatString.cpp') diff --git a/clang/lib/Analysis/FormatString.cpp b/clang/lib/Analysis/FormatString.cpp index 30bfe4bf884..1c911c45c3b 100644 --- a/clang/lib/Analysis/FormatString.cpp +++ b/clang/lib/Analysis/FormatString.cpp @@ -336,9 +336,23 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const { return argTy->isPointerType() || argTy->isObjCObjectPointerType() || argTy->isNullPtrType(); - case ObjCPointerTy: - return argTy->getAs() || - argTy->getAs(); + case ObjCPointerTy: { + if (argTy->getAs() || + argTy->getAs()) + return true; + + // Handle implicit toll-free bridging. + if (const PointerType *PT = argTy->getAs()) { + // Things such as CFTypeRef are really just opaque pointers + // to C structs representing CF types that can often be bridged + // to Objective-C objects. Since the compiler doesn't know which + // structs can be toll-free bridged, we just accept them all. + QualType pointee = PT->getPointeeType(); + if (pointee->getAsStructureType() || pointee->isVoidType()) + return true; + } + return false; + } } llvm_unreachable("Invalid ArgTypeResult Kind!"); -- cgit v1.2.3