Skip to content

Commit 4664bc6

Browse files
[SR-7263] Treat APIs returning unmanaged CF types as NS_RETURNS_INNER_POINTER
1 parent d282b1c commit 4664bc6

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

lib/SIL/SILFunctionType.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,11 @@ class ObjCMethodConventions : public Conventions {
14561456
if (tl.isTrivial()) {
14571457
if (Method->hasAttr<clang::ObjCReturnsInnerPointerAttr>())
14581458
return ResultConvention::UnownedInnerPointer;
1459+
1460+
auto type = tl.getLoweredType();
1461+
if (type.unwrapOptionalType().getStructOrBoundGenericStruct()
1462+
== type.getASTContext().getUnmanagedDecl())
1463+
return ResultConvention::UnownedInnerPointer;
14591464
return ResultConvention::Unowned;
14601465
}
14611466

test/SILGen/cf.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func useEmAll(_ model: CCMagnetismModel) {
2929
// CHECK: function_ref @CCRefrigeratorDestroy : $@convention(c) (@owned Optional<CCRefrigerator>) -> ()
3030
CCRefrigeratorDestroy(clone)
3131

32-
// CHECK: objc_method [[ARG]] : $CCMagnetismModel, #CCMagnetismModel.refrigerator!1.foreign : (CCMagnetismModel) -> () -> Unmanaged<CCRefrigerator>?, $@convention(objc_method) (CCMagnetismModel) -> Optional<Unmanaged<CCRefrigerator>>
32+
// CHECK: objc_method [[ARG]] : $CCMagnetismModel, #CCMagnetismModel.refrigerator!1.foreign : (CCMagnetismModel) -> () -> Unmanaged<CCRefrigerator>?, $@convention(objc_method) (CCMagnetismModel) -> @unowned_inner_pointer Optional<Unmanaged<CCRefrigerator>>
3333
let f0 = model.refrigerator()
3434

3535
// CHECK: objc_method [[ARG]] : $CCMagnetismModel, #CCMagnetismModel.getRefrigerator!1.foreign : (CCMagnetismModel) -> () -> CCRefrigerator?, $@convention(objc_method) (CCMagnetismModel) -> @autoreleased Optional<CCRefrigerator>

0 commit comments

Comments
 (0)