@@ -3906,8 +3906,8 @@ namespace {
39063906 } else if (allSingleRefcount
39073907 && ElementsWithNoPayload.size () <= 1 ) {
39083908 CopyDestroyKind = TaggedRefcounted;
3909- } else if (this ->EnumImplStrategy ::BitwiseTakable == IsBitwiseTakable &&
3910- Copyable == IsCopyable) {
3909+ } else if (this ->EnumImplStrategy ::BitwiseTakable == IsBitwiseTakableAndBorrowable
3910+ && Copyable == IsCopyable) {
39113911 CopyDestroyKind = BitwiseTakable;
39123912 }
39133913 }
@@ -6365,7 +6365,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
63656365 ? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
63666366 auto copyable = !theEnum->canBeCopyable ()
63676367 ? IsNotCopyable : IsCopyable;
6368- auto bitwiseTakable = IsBitwiseTakable ; // FIXME: will there be check here?
6368+ auto bitwiseTakable = IsBitwiseTakableAndBorrowable ; // FIXME: will there be check here?
63696369 bool allowFixedLayoutOptimizations = true ;
63706370 std::vector<Element> elementsWithPayload;
63716371 std::vector<Element> elementsWithNoPayload;
@@ -6377,7 +6377,7 @@ EnumImplStrategy::get(TypeConverter &TC, SILType type, EnumDecl *theEnum) {
63776377 payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal);
63786378 copyable = copyable & payloadTI.isCopyable (ResilienceExpansion::Maximal);
63796379 bitwiseTakable = bitwiseTakable &
6380- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
6380+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
63816381 };
63826382
63836383 if (TC.IGM .isResilient (theEnum, ResilienceExpansion::Minimal))
@@ -6825,7 +6825,8 @@ EnumImplStrategy::getFixedEnumTypeInfo(llvm::StructType *T, Size S,
68256825 AlwaysFixedSize);
68266826 break ;
68276827 case Loadable:
6828- assert (isBT && " loadable enum not bitwise takable?!" );
6828+ assert (isBT == IsBitwiseTakableAndBorrowable
6829+ && " loadable enum not bitwise takable?!" );
68296830 mutableTI = new LoadableEnumTypeInfo (*this , T, S, std::move (SB), A,
68306831 isTriviallyDestroyable,
68316832 isCopyable,
@@ -7038,7 +7039,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeFixedLayout(
70387039 getFixedEnumTypeInfo (
70397040 enumTy, Size (sizeWithTag), spareBits.build (), alignment,
70407041 deinit & payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal),
7041- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7042+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
70427043 copyable);
70437044 if (TIK >= Loadable && CopyDestroyKind == Normal) {
70447045 computePayloadTypesAndTagType (TC.IGM , *TI, PayloadTypesAndTagType);
@@ -7073,7 +7074,7 @@ TypeInfo *SinglePayloadEnumImplStrategy::completeDynamicLayout(
70737074 return registerEnumTypeInfo (new NonFixedEnumTypeInfo (*this , enumTy,
70747075 alignment,
70757076 deinit & payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal),
7076- payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal),
7077+ payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal),
70777078 copyable,
70787079 enumAccessible));
70797080}
@@ -7108,16 +7109,15 @@ MultiPayloadEnumImplStrategy::completeFixedLayout(TypeConverter &TC,
71087109 ? IsNotCopyable : IsCopyable;
71097110 auto isTriviallyDestroyable = theEnum->getValueTypeDestructor ()
71107111 ? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7111- IsBitwiseTakable_t isBT = IsBitwiseTakable ;
7112+ IsBitwiseTakable_t isBT = IsBitwiseTakableAndBorrowable ;
71127113 PayloadSize = 0 ;
71137114 for (auto &elt : ElementsWithPayload) {
71147115 auto &fixedPayloadTI = cast<FixedTypeInfo>(*elt.ti );
71157116 if (fixedPayloadTI.getFixedAlignment () > worstAlignment)
71167117 worstAlignment = fixedPayloadTI.getFixedAlignment ();
71177118 if (!fixedPayloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal))
71187119 isTriviallyDestroyable = IsNotTriviallyDestroyable;
7119- if (!fixedPayloadTI.isBitwiseTakable (ResilienceExpansion::Maximal))
7120- isBT = IsNotBitwiseTakable;
7120+ isBT &= fixedPayloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
71217121
71227122 unsigned payloadBytes = fixedPayloadTI.getFixedSize ().getValue ();
71237123 unsigned payloadBits = fixedPayloadTI.getFixedSize ().getValueInBits ();
@@ -7274,12 +7274,12 @@ TypeInfo *MultiPayloadEnumImplStrategy::completeDynamicLayout(
72747274 Alignment alignment (1 );
72757275 auto td = theEnum->getValueTypeDestructor ()
72767276 ? IsNotTriviallyDestroyable : IsTriviallyDestroyable;
7277- auto bt = IsBitwiseTakable ;
7277+ auto bt = IsBitwiseTakableAndBorrowable ;
72787278 for (auto &element : ElementsWithPayload) {
72797279 auto &payloadTI = *element.ti ;
72807280 alignment = std::max (alignment, payloadTI.getBestKnownAlignment ());
72817281 td &= payloadTI.isTriviallyDestroyable (ResilienceExpansion::Maximal);
7282- bt &= payloadTI.isBitwiseTakable (ResilienceExpansion::Maximal);
7282+ bt &= payloadTI.getBitwiseTakable (ResilienceExpansion::Maximal);
72837283 }
72847284
72857285 applyLayoutAttributes (TC.IGM , theEnum, /* fixed*/ false , alignment);
0 commit comments