@@ -72,6 +72,7 @@ class FunctionParam {
72
72
void setValueOwnership (ValueOwnership ownership) {
73
73
Flags = Flags.withValueOwnership (ownership);
74
74
}
75
+ void setNoDerivative () { Flags = Flags.withNoDerivative (true ); }
75
76
void setFlags (ParameterFlags flags) { Flags = flags; };
76
77
77
78
FunctionParam withLabel (StringRef label) const {
@@ -737,27 +738,6 @@ class TypeDecoder {
737
738
++firstChildIdx;
738
739
}
739
740
740
- bool isThrow = false ;
741
- if (Node->getChild (firstChildIdx)->getKind ()
742
- == NodeKind::ThrowsAnnotation) {
743
- isThrow = true ;
744
- ++firstChildIdx;
745
- }
746
-
747
- bool isSendable = false ;
748
- if (Node->getChild (firstChildIdx)->getKind ()
749
- == NodeKind::ConcurrentFunctionType) {
750
- isSendable = true ;
751
- ++firstChildIdx;
752
- }
753
-
754
- bool isAsync = false ;
755
- if (Node->getChild (firstChildIdx)->getKind ()
756
- == NodeKind::AsyncAnnotation) {
757
- isAsync = true ;
758
- ++firstChildIdx;
759
- }
760
-
761
741
FunctionMetadataDifferentiabilityKind diffKind;
762
742
if (Node->getChild (firstChildIdx)->getKind () ==
763
743
NodeKind::DifferentiableFunctionType) {
@@ -783,6 +763,27 @@ class TypeDecoder {
783
763
++firstChildIdx;
784
764
}
785
765
766
+ bool isThrow = false ;
767
+ if (Node->getChild (firstChildIdx)->getKind ()
768
+ == NodeKind::ThrowsAnnotation) {
769
+ isThrow = true ;
770
+ ++firstChildIdx;
771
+ }
772
+
773
+ bool isSendable = false ;
774
+ if (Node->getChild (firstChildIdx)->getKind ()
775
+ == NodeKind::ConcurrentFunctionType) {
776
+ isSendable = true ;
777
+ ++firstChildIdx;
778
+ }
779
+
780
+ bool isAsync = false ;
781
+ if (Node->getChild (firstChildIdx)->getKind ()
782
+ == NodeKind::AsyncAnnotation) {
783
+ isAsync = true ;
784
+ ++firstChildIdx;
785
+ }
786
+
786
787
flags = flags.withConcurrent (isSendable)
787
788
.withAsync (isAsync).withThrows (isThrow)
788
789
.withDifferentiable (diffKind.isDifferentiable ());
@@ -1370,33 +1371,44 @@ class TypeDecoder {
1370
1371
FunctionParam<BuiltType> ¶m) -> bool {
1371
1372
Demangle::NodePointer node = typeNode;
1372
1373
1373
- auto setOwnership = [&](ValueOwnership ownership) {
1374
- param.setValueOwnership (ownership);
1375
- node = node->getFirstChild ();
1376
- hasParamFlags = true ;
1377
- };
1378
- switch (node->getKind ()) {
1379
- case NodeKind::InOut:
1380
- setOwnership (ValueOwnership::InOut);
1381
- break ;
1374
+ bool recurse = true ;
1375
+ while (recurse) {
1376
+ switch (node->getKind ()) {
1377
+ case NodeKind::InOut:
1378
+ param.setValueOwnership (ValueOwnership::InOut);
1379
+ node = node->getFirstChild ();
1380
+ hasParamFlags = true ;
1381
+ break ;
1382
1382
1383
- case NodeKind::Shared:
1384
- setOwnership (ValueOwnership::Shared);
1385
- break ;
1383
+ case NodeKind::Shared:
1384
+ param.setValueOwnership (ValueOwnership::Shared);
1385
+ node = node->getFirstChild ();
1386
+ hasParamFlags = true ;
1387
+ break ;
1386
1388
1387
- case NodeKind::Owned:
1388
- setOwnership (ValueOwnership::Owned);
1389
- break ;
1389
+ case NodeKind::Owned:
1390
+ param.setValueOwnership (ValueOwnership::Owned);
1391
+ node = node->getFirstChild ();
1392
+ hasParamFlags = true ;
1393
+ break ;
1390
1394
1391
- case NodeKind::AutoClosureType:
1392
- case NodeKind::EscapingAutoClosureType: {
1393
- param.setAutoClosure ();
1394
- hasParamFlags = true ;
1395
- break ;
1396
- }
1395
+ case NodeKind::NoDerivative:
1396
+ param.setNoDerivative ();
1397
+ node = node->getFirstChild ();
1398
+ hasParamFlags = true ;
1399
+ break ;
1397
1400
1398
- default :
1399
- break ;
1401
+ case NodeKind::AutoClosureType:
1402
+ case NodeKind::EscapingAutoClosureType:
1403
+ param.setAutoClosure ();
1404
+ hasParamFlags = true ;
1405
+ recurse = false ;
1406
+ break ;
1407
+
1408
+ default :
1409
+ recurse = false ;
1410
+ break ;
1411
+ }
1400
1412
}
1401
1413
1402
1414
auto paramType = decodeMangledType (node);
0 commit comments