@@ -2171,31 +2171,34 @@ void ApplyRewriter::convertBeginApplyWithOpaqueYield() {
2171
2171
for (auto i : indices (oldResults)) {
2172
2172
auto &oldResult = oldResults[i];
2173
2173
auto &newResult = newResults[i];
2174
+ if (oldResult.getType ().isObject () && newResult.getType ().isObject ()) {
2175
+ // Handle direct conventions.
2176
+ oldResult.replaceAllUsesWith (&newResult);
2177
+ continue ;
2178
+ }
2179
+ if (oldResult.getType ().isAddress ()) {
2180
+ // Handle inout convention.
2181
+ assert (newResult.getType ().isAddress ());
2182
+ oldResult.replaceAllUsesWith (&newResult);
2183
+ continue ;
2184
+ }
2174
2185
if (oldResult.getType ().isAddressOnly (*pass.function )) {
2175
- if (!oldResult.getType ().isAddress ()) {
2176
- pass.valueStorageMap .setStorageAddress (&oldResult, &newResult);
2177
- pass.valueStorageMap .getStorage (&oldResult).markRewritten ();
2178
- } else {
2179
- oldResult.replaceAllUsesWith (&newResult);
2180
- }
2186
+ // Remap storage when an address-only type is yielded as an opaque value.
2187
+ pass.valueStorageMap .setStorageAddress (&oldResult, &newResult);
2188
+ pass.valueStorageMap .getStorage (&oldResult).markRewritten ();
2189
+ continue ;
2190
+ }
2191
+ assert (oldResult.getType ().isObject ());
2192
+ assert (newResult.getType ().isAddress ());
2193
+ if (oldResult.getOwnershipKind () == OwnershipKind::Guaranteed) {
2194
+ SILValue load =
2195
+ resultBuilder.emitLoadBorrowOperation (callLoc, &newResult);
2196
+ oldResult.replaceAllUsesWith (load);
2197
+ emitEndBorrows (load, pass);
2181
2198
} else {
2182
- if (oldResult.getType ().isObject () && newResult.getType ().isAddress ()) {
2183
- if (oldResult.getOwnershipKind () == OwnershipKind::Guaranteed) {
2184
- SILValue load =
2185
- resultBuilder.emitLoadBorrowOperation (callLoc, &newResult);
2186
- oldResult.replaceAllUsesWith (load);
2187
- emitEndBorrows (load, pass);
2188
- } else {
2189
- auto *load = resultBuilder.createLoad (
2190
- callLoc, &newResult,
2191
- newResult.getType ().isTrivial (*pass.function )
2192
- ? LoadOwnershipQualifier::Trivial
2193
- : LoadOwnershipQualifier::Take);
2194
- oldResult.replaceAllUsesWith (load);
2195
- }
2196
- } else {
2197
- oldResult.replaceAllUsesWith (&newResult);
2198
- }
2199
+ auto *load = resultBuilder.createTrivialLoadOr (
2200
+ callLoc, &newResult, LoadOwnershipQualifier::Take);
2201
+ oldResult.replaceAllUsesWith (load);
2199
2202
}
2200
2203
}
2201
2204
}
0 commit comments