diff --git a/lib/SILGen/SILGenLValue.cpp b/lib/SILGen/SILGenLValue.cpp index e4c9a9136498c..501855b2bf90f 100644 --- a/lib/SILGen/SILGenLValue.cpp +++ b/lib/SILGen/SILGenLValue.cpp @@ -5227,6 +5227,14 @@ void SILGenFunction::emitSemanticStore(SILLocation loc, dest = B.createMoveOnlyWrapperToCopyableAddr(loc, dest); } + // If the dest type differs only in concurrency annotations, we can cast them + // off. + if (dest->getType().getObjectType() != rvalue->getType().getObjectType() + && dest->getType().stripConcurrency(/*recursive*/true, /*dropGlobal*/true) + == rvalue->getType().stripConcurrency(true, true)) { + dest = B.createUncheckedAddrCast(loc, dest, rvalue->getType().getAddressType()); + } + // Easy case: the types match. if (rvalue->getType().getObjectType() == dest->getType().getObjectType()) { assert(!silConv.useLoweredAddresses() || diff --git a/test/SILGen/Inputs/preconcurrency-bridged-return.h b/test/SILGen/Inputs/preconcurrency-bridged-return.h new file mode 100644 index 0000000000000..12ed7cdebdb1b --- /dev/null +++ b/test/SILGen/Inputs/preconcurrency-bridged-return.h @@ -0,0 +1,9 @@ +@import Foundation; + +#define NS_SWIFT_SENDABLE __attribute__((__swift_attr__("@Sendable"))) + +@interface TestClass: NSObject + +- (_Nullable id NS_SWIFT_SENDABLE)foo; + +@end diff --git a/test/SILGen/preconcurrency-bridged-return.swift b/test/SILGen/preconcurrency-bridged-return.swift new file mode 100644 index 0000000000000..d7a4d7a83c327 --- /dev/null +++ b/test/SILGen/preconcurrency-bridged-return.swift @@ -0,0 +1,8 @@ +// RUN: %target-swift-emit-silgen(mock-sdk: %clang-importer-sdk) -import-objc-header %S/Inputs/preconcurrency-bridged-return.h -swift-version 5 %s +// +// REQUIRES: objc_interop + +func test(x: TestClass) { + let foo = x.foo() +} +