mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
IRGen: EmptyBoxType's representation cannot be nil because of a conflict with extra inhabitant assumption in indirect enums (#10326)
* IRGen: EmptyBoxType's representation cannot be nil because of a conflict with extra inhabitant assumption in indirect enums We map nil to the .None case of Optional. Instead use a singleton object. SR-5148 rdar://32618580
This commit is contained in:
committed by
GitHub
parent
6f3b8ca60f
commit
48e889b51b
@@ -1430,7 +1430,7 @@ public:
|
||||
allocate(IRGenFunction &IGF, SILType boxedType, GenericEnvironment *env,
|
||||
const llvm::Twine &name) const override {
|
||||
return OwnedAddress(IGF.getTypeInfo(boxedType).getUndefAddress(),
|
||||
IGF.IGM.RefCountedNull);
|
||||
IGF.emitAllocEmptyBoxCall());
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1584,7 +1584,11 @@ const TypeInfo *TypeConverter::convertBoxType(SILBoxType *T) {
|
||||
// For fixed-sized types, we can emit concrete box metadata.
|
||||
auto &fixedTI = cast<FixedTypeInfo>(eltTI);
|
||||
|
||||
// For empty types, we don't really need to allocate anything.
|
||||
// Because we assume in enum's that payloads with a Builtin.NativeObject which
|
||||
// is also the type for indirect enum cases have extra inhabitants of pointers
|
||||
// we can't have a nil pointer as a representation for an empty box type --
|
||||
// nil conflicts with the extra inhabitants. We return a static singleton
|
||||
// empty box object instead.
|
||||
if (fixedTI.isKnownEmpty(ResilienceExpansion::Maximal)) {
|
||||
if (!EmptyBoxTI)
|
||||
EmptyBoxTI = new EmptyBoxTypeInfo(IGM);
|
||||
|
||||
Reference in New Issue
Block a user