@@ -848,18 +848,10 @@ namespace {
848
848
849
849
SILValue getOwnedScalar (Source source, const TypeLowering &srcTL) {
850
850
assert (!source.isAddress ());
851
- return source.Value ;
852
- }
853
-
854
- Source putOwnedScalar (SILValue scalar, Target target) {
855
- assert (scalar->getType () == target.LoweredType .getObjectType ());
856
- if (!target.isAddress ())
857
- return target.asScalarSource (scalar);
858
-
859
- auto &targetTL = getTypeLowering (target.LoweredType );
860
- targetTL.emitStoreOfCopy (B, Loc, scalar, target.Address ,
861
- IsInitialization);
862
- return target.asAddressSource ();
851
+ auto value = source.Value ;
852
+ if (value.getOwnershipKind () == OwnershipKind::Guaranteed)
853
+ value = B.emitCopyValueOperation (Loc, value);
854
+ return value;
863
855
}
864
856
865
857
Source emitSameType (Source source, Target target) {
@@ -917,7 +909,8 @@ namespace {
917
909
if (source.isAddress ()) {
918
910
value = srcTL.emitLoadOfCopy (B, Loc, source.Value , IsTake);
919
911
} else {
920
- value = getOwnedScalar (source, srcTL);
912
+ // May have any valid ownership.
913
+ value = source.Value ;
921
914
}
922
915
auto targetFormalTy = target.FormalType ;
923
916
auto targetLoweredTy =
@@ -929,7 +922,15 @@ namespace {
929
922
} else {
930
923
value = B.createUpcast (Loc, value, targetLoweredTy);
931
924
}
932
- return putOwnedScalar (value, target);
925
+ // If the target is an address, then scalar must be Owned. Otherwise, it
926
+ // may be Guaranteed.
927
+ assert (value->getType () == target.LoweredType .getObjectType ());
928
+ if (!target.isAddress ())
929
+ return target.asScalarSource (value);
930
+
931
+ auto &targetTL = getTypeLowering (target.LoweredType );
932
+ targetTL.emitStoreOfCopy (B, Loc, value, target.Address , IsInitialization);
933
+ return target.asAddressSource ();
933
934
}
934
935
935
936
Source emitAndInjectIntoOptionals (Source source, Target target,
@@ -961,7 +962,9 @@ namespace {
961
962
if (source.isAddress ()) {
962
963
B.createSwitchEnumAddr (Loc, source.Value , /* default*/ nullptr , cases);
963
964
} else {
964
- B.createSwitchEnum (Loc, source.Value , /* default*/ nullptr , cases);
965
+ auto *switchEnum =
966
+ B.createSwitchEnum (Loc, source.Value , /* default*/ nullptr , cases);
967
+ switchEnum->createOptionalSomeResult ();
965
968
}
966
969
967
970
// Create the Some block, which recurses.
@@ -988,10 +991,7 @@ namespace {
988
991
sourceSomeDecl, loweredSourceObjectType);
989
992
objectSource = Source (sourceAddr, sourceObjectType);
990
993
} else {
991
- // switch enum always start as @owned.
992
- SILValue sourceObjectValue = someBB->createPhiArgument (
993
- loweredSourceObjectType, OwnershipKind::Owned);
994
- objectSource = Source (sourceObjectValue, sourceObjectType);
994
+ objectSource = Source (someBB->getArgument (0 ), sourceObjectType);
995
995
}
996
996
997
997
Source resultObject = emit (objectSource, objectTarget);
@@ -1006,7 +1006,9 @@ namespace {
1006
1006
if (target.isAddress ()) {
1007
1007
B.createBranch (Loc, contBB);
1008
1008
} else {
1009
- B.createBranch (Loc, contBB, { result.Value });
1009
+ auto &resultTL = getTypeLowering (result.Value ->getType ());
1010
+ SILValue resultVal = getOwnedScalar (source, resultTL);
1011
+ B.createBranch (Loc, contBB, {resultVal});
1010
1012
}
1011
1013
}
1012
1014
@@ -1057,18 +1059,18 @@ namespace {
1057
1059
}
1058
1060
}
1059
1061
1062
+ // May return an Owned or Guaranteed result. If source is has ownership
1063
+ // None, then the result may still be Guaranteed for nontrivial types.
1060
1064
Source emitSome (Source source, Target target, EmitSomeState &state) {
1061
1065
// If our target is an address, prepareForEmitSome should have set this
1062
1066
// up so that we emitted directly into
1063
1067
if (target.isAddress ()) {
1064
1068
B.createInjectEnumAddr (Loc, target.Address , state.SomeDecl );
1065
1069
return target.asAddressSource ();
1066
1070
} else {
1067
- auto &srcTL = getTypeLowering (source.Value ->getType ());
1068
- auto sourceObject = getOwnedScalar (source, srcTL);
1069
- auto source = B.createEnum (Loc, sourceObject, state.SomeDecl ,
1070
- target.LoweredType );
1071
- return target.asScalarSource (source);
1071
+ auto someEnum =
1072
+ B.createEnum (Loc, source.Value , state.SomeDecl , target.LoweredType );
1073
+ return target.asScalarSource (someEnum);
1072
1074
}
1073
1075
}
1074
1076
0 commit comments