@@ -78,6 +78,7 @@ class FunctionParam {
7878 }
7979 void setNoDerivative () { Flags = Flags.withNoDerivative (true ); }
8080 void setIsolated () { Flags = Flags.withIsolated (true ); }
81+ void setTransferring () { Flags = Flags.withTransferring (true ); }
8182 void setFlags (ParameterFlags flags) { Flags = flags; };
8283
8384 FunctionParam withLabel (StringRef label) const {
@@ -109,6 +110,7 @@ enum class ImplParameterConvention {
109110
110111enum class ImplParameterInfoFlags : uint8_t {
111112 NotDifferentiable = 0x1 ,
113+ Transferring = 0x2 ,
112114};
113115
114116using ImplParameterInfoOptions = OptionSet<ImplParameterInfoFlags>;
@@ -282,72 +284,88 @@ class ImplFunctionTypeFlags {
282284 unsigned Async : 1 ;
283285 unsigned ErasedIsolation : 1 ;
284286 unsigned DifferentiabilityKind : 3 ;
287+ unsigned HasTransferringResult : 1 ;
285288
286289public:
287290 ImplFunctionTypeFlags ()
288291 : Rep(0 ), Pseudogeneric(0 ), Escaping(0 ), Concurrent(0 ), Async(0 ),
289- ErasedIsolation (0 ), DifferentiabilityKind(0 ) {}
292+ ErasedIsolation (0 ), DifferentiabilityKind(0 ), HasTransferringResult(0 ) {
293+ }
290294
291295 ImplFunctionTypeFlags (ImplFunctionRepresentation rep, bool pseudogeneric,
292296 bool noescape, bool concurrent, bool async,
293297 bool erasedIsolation,
294- ImplFunctionDifferentiabilityKind diffKind)
298+ ImplFunctionDifferentiabilityKind diffKind,
299+ bool hasTransferringResult)
295300 : Rep(unsigned (rep)), Pseudogeneric(pseudogeneric), Escaping(noescape),
296301 Concurrent(concurrent), Async(async), ErasedIsolation(erasedIsolation),
297- DifferentiabilityKind(unsigned (diffKind)) {}
302+ DifferentiabilityKind(unsigned (diffKind)),
303+ HasTransferringResult(hasTransferringResult) {}
298304
299305 ImplFunctionTypeFlags
300306 withRepresentation (ImplFunctionRepresentation rep) const {
301307 return ImplFunctionTypeFlags (
302308 rep, Pseudogeneric, Escaping, Concurrent, Async, ErasedIsolation,
303- ImplFunctionDifferentiabilityKind (DifferentiabilityKind));
309+ ImplFunctionDifferentiabilityKind (DifferentiabilityKind),
310+ HasTransferringResult);
304311 }
305312
306313 ImplFunctionTypeFlags
307314 withConcurrent () const {
308315 return ImplFunctionTypeFlags (
309- ImplFunctionRepresentation (Rep), Pseudogeneric, Escaping, true ,
310- Async, ErasedIsolation,
311- ImplFunctionDifferentiabilityKind (DifferentiabilityKind));
316+ ImplFunctionRepresentation (Rep), Pseudogeneric, Escaping, true , Async,
317+ ErasedIsolation,
318+ ImplFunctionDifferentiabilityKind (DifferentiabilityKind),
319+ HasTransferringResult);
312320 }
313321
314322 ImplFunctionTypeFlags
315323 withAsync () const {
316324 return ImplFunctionTypeFlags (
317325 ImplFunctionRepresentation (Rep), Pseudogeneric, Escaping, Concurrent,
318326 true , ErasedIsolation,
319- ImplFunctionDifferentiabilityKind (DifferentiabilityKind));
327+ ImplFunctionDifferentiabilityKind (DifferentiabilityKind),
328+ HasTransferringResult);
320329 }
321330
322331 ImplFunctionTypeFlags
323332 withEscaping () const {
324333 return ImplFunctionTypeFlags (
325334 ImplFunctionRepresentation (Rep), Pseudogeneric, true , Concurrent, Async,
326335 ErasedIsolation,
327- ImplFunctionDifferentiabilityKind (DifferentiabilityKind));
336+ ImplFunctionDifferentiabilityKind (DifferentiabilityKind),
337+ HasTransferringResult);
328338 }
329339
330340 ImplFunctionTypeFlags
331341 withErasedIsolation () const {
332342 return ImplFunctionTypeFlags (
333343 ImplFunctionRepresentation (Rep), Pseudogeneric, Escaping, Concurrent,
334- Async, true ,
335- ImplFunctionDifferentiabilityKind (DifferentiabilityKind) );
344+ Async, true , ImplFunctionDifferentiabilityKind (DifferentiabilityKind),
345+ HasTransferringResult );
336346 }
337347
338348 ImplFunctionTypeFlags
339349 withPseudogeneric () const {
340350 return ImplFunctionTypeFlags (
341351 ImplFunctionRepresentation (Rep), true , Escaping, Concurrent, Async,
342352 ErasedIsolation,
343- ImplFunctionDifferentiabilityKind (DifferentiabilityKind));
353+ ImplFunctionDifferentiabilityKind (DifferentiabilityKind),
354+ HasTransferringResult);
344355 }
345356
346357 ImplFunctionTypeFlags
347358 withDifferentiabilityKind (ImplFunctionDifferentiabilityKind diffKind) const {
348359 return ImplFunctionTypeFlags (ImplFunctionRepresentation (Rep), Pseudogeneric,
349360 Escaping, Concurrent, Async, ErasedIsolation,
350- diffKind);
361+ diffKind, HasTransferringResult);
362+ }
363+
364+ ImplFunctionTypeFlags withTransferringResult () const {
365+ return ImplFunctionTypeFlags (
366+ ImplFunctionRepresentation (Rep), Pseudogeneric, Escaping, Concurrent,
367+ Async, ErasedIsolation,
368+ ImplFunctionDifferentiabilityKind (DifferentiabilityKind), true );
351369 }
352370
353371 ImplFunctionRepresentation getRepresentation () const {
@@ -364,6 +382,8 @@ class ImplFunctionTypeFlags {
364382
365383 bool hasErasedIsolation () const { return ErasedIsolation; }
366384
385+ bool hasTransferringResult () const { return HasTransferringResult; }
386+
367387 bool isDifferentiable () const {
368388 return getDifferentiabilityKind () !=
369389 ImplFunctionDifferentiabilityKind::NonDifferentiable;
@@ -868,6 +888,12 @@ class TypeDecoder {
868888 extFlags = extFlags.withIsolatedAny ();
869889 ++firstChildIdx;
870890 }
891+
892+ if (Node->getChild (firstChildIdx)->getKind () ==
893+ NodeKind::TransferringResultFunctionType) {
894+ extFlags = extFlags.withTransferringResult ();
895+ ++firstChildIdx;
896+ }
871897
872898 FunctionMetadataDifferentiabilityKind diffKind;
873899 if (Node->getChild (firstChildIdx)->getKind () ==
@@ -1707,6 +1733,12 @@ class TypeDecoder {
17071733 hasParamFlags = true ;
17081734 break ;
17091735
1736+ case NodeKind::Transferring:
1737+ param.setTransferring ();
1738+ node = node->getFirstChild ();
1739+ hasParamFlags = true ;
1740+ break ;
1741+
17101742 case NodeKind::AutoClosureType:
17111743 case NodeKind::EscapingAutoClosureType:
17121744 param.setAutoClosure ();
0 commit comments