зеркало из https://github.com/microsoft/clang-1.git
Tweak format string checking to work with %@ and ObjC toll-free bridging. <rdar://problem/10814120>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149907 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
fd8fed902d
Коммит
b4a3ef783c
|
@ -336,9 +336,23 @@ bool ArgTypeResult::matchesType(ASTContext &C, QualType argTy) const {
|
|||
return argTy->isPointerType() || argTy->isObjCObjectPointerType() ||
|
||||
argTy->isNullPtrType();
|
||||
|
||||
case ObjCPointerTy:
|
||||
return argTy->getAs<ObjCObjectPointerType>() ||
|
||||
argTy->getAs<BlockPointerType>();
|
||||
case ObjCPointerTy: {
|
||||
if (argTy->getAs<ObjCObjectPointerType>() ||
|
||||
argTy->getAs<BlockPointerType>())
|
||||
return true;
|
||||
|
||||
// Handle implicit toll-free bridging.
|
||||
if (const PointerType *PT = argTy->getAs<PointerType>()) {
|
||||
// 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!");
|
||||
|
|
|
@ -146,3 +146,8 @@ void test_percent_C() {
|
|||
const wchar_t wchar_data = L'a';
|
||||
NSLog(@"%C", wchar_data); // expected-warning{{format specifies type 'unsigned short' but the argument has type 'wchar_t'}}
|
||||
}
|
||||
|
||||
// Test that %@ works with toll-free bridging (<rdar://problem/10814120>).
|
||||
void test_toll_free_bridging(CFStringRef x) {
|
||||
NSLog(@"%@", x); // no-warning
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче