I have a simple type alias: public typealias SendableCustomStringConvertible = Sendable & CustomStringConvertible
Trying to compile framework, I get a compiler error:
Undefined symbols for architecture x86_64:
"protocol descriptor for Swift.Sendable", referenced from:
type metadata accessor for Swift.CustomStringConvertible & Swift.Sendable in BaseError.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
The problem is that this error is not reproducable in another project. What are the possible reasons? What am I doing wrong?
The problem for now is only with typealis. But error occurs in another file. What I mean is typealias is defined in file A, and error occurs in file B.
If I replace typealias with direct protocol composition of Sendable & CustomStringConvertible, the error still occurs, only in file B and only inside this particular framework.
Some more details:
it is a dynamic framework
framework imports only one system library: Foundation
3 libraries are added via SPM: SwiftCollections, NonEmpty, SwiftURL
The simplified code in file B is:
public protocol BaseError: LocalizedError, CustomStringConvertible, CustomDebugStringConvertible {
var code: Int { get }
var domain: String { get }
var domainShortCode: String { get }
var underlying: BaseError? { get }
var userInfo: [String: any SendableCustomStringConvertible] { get }
}
Just while writing the message above I've got an idea: the minimal deploy target is iOS 12. So, I bumped it to iOS 13 and error has disappeared.
Thanks for response
Glad you figured it out! Still, I was under the impression that as a marker protocol, Sendable was meant to have no ABI impact, so I’m a bit confused why it would be showing up in linker errors…
(And, regardless, it seems like availability checking should have thrown this out with a reasonable error messages as opposed to a linking failure)