mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Layout for an enum depends very intimately on its cases---both their existence and what their payload types are. That means there's no way to "partly" recover from failure to deserialize an individual case's payload type, the way we can partly recover from failing to deserialize an initializer in a class. Add deserialization recovery to enums by validating all of their payload types up front, and dropping the enum if we can't import all of the cases. This is the first time where we're trying to do deserialization recovery for a /type/, and that could have many more ripple effects than for a var/func/subscript/init. A better answer here might be to still import the enum but mark it as unavailable, but in that case we'd have to make sure to propagate that unavailability to anything that /used/ the enum as well. (In Swift, availability is checked based on use of the name, so if someone manages to refer to an enum using inferred types we'd be in trouble.) There is one case here that's not covered: if an enum case has a payload that references a type declaration nested within the enum, but then that nested type /itself/ can't be loaded for some reason, we have no way to check that up front, because we can't even try to load the nested type without loading its parent DeclContext (the enum). I can't think of an easy solution for this right now. (In the future, we'll be able to support dropping a single case for resilient enums. But we're not there right now.) rdar://problem/31920901
45 KiB
45 KiB