Author: george.karpenkov Date: Fri Feb 1 15:06:44 2019 New Revision: 352938
URL: http://llvm.org/viewvc/llvm-project?rev=352938&view=rev Log: [analyzer] Hotfix for RetainCountChecker: assert was too strong. Bridged casts can happen to non-CF objects as well. Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp cfe/trunk/test/Analysis/objc-arc.m Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp?rev=352938&r1=352937&r2=352938&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp Fri Feb 1 15:06:44 2019 @@ -187,11 +187,10 @@ void RetainCountChecker::checkPostStmt(c QualType QT = CE->getType(); ObjKind K; - if (coreFoundation::isCFObjectRef(QT)) { - K = ObjKind::CF; - } else { - assert(cocoa::isCocoaObjectRef(QT)); + if (QT->isObjCObjectPointerType()) { K = ObjKind::ObjC; + } else { + K = ObjKind::CF; } ArgEffect AE = ArgEffect(IncRef, K); Modified: cfe/trunk/test/Analysis/objc-arc.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/objc-arc.m?rev=352938&r1=352937&r2=352938&view=diff ============================================================================== --- cfe/trunk/test/Analysis/objc-arc.m (original) +++ cfe/trunk/test/Analysis/objc-arc.m Fri Feb 1 15:06:44 2019 @@ -239,8 +239,23 @@ extern const CFAllocatorRef kCFAllocator extern CFTypeRef CFRetain(CFTypeRef cf); extern void CFRelease(CFTypeRef cf); + void check_bridge_retained_cast() { NSString *nsStr = [[NSString alloc] init]; CFStringRef cfStr = (__bridge_retained CFStringRef)nsStr; CFRelease(cfStr); // no-warning } + +@interface A; +@end + +void check_bridge_to_non_cocoa(CFStringRef s) { + A *a = (__bridge_transfer A *) s; // no-crash +} + +struct B; + +struct B * check_bridge_to_non_cf() { + NSString *s = [[NSString alloc] init]; + return (__bridge struct B*) s; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits