@@ -72,6 +72,7 @@ class FunctionParam {
7272 void setValueOwnership (ValueOwnership ownership) {
7373 Flags = Flags.withValueOwnership (ownership);
7474 }
75+ void setNoDerivative () { Flags = Flags.withNoDerivative (true ); }
7576 void setFlags (ParameterFlags flags) { Flags = flags; };
7677
7778 FunctionParam withLabel (StringRef label) const {
@@ -737,27 +738,6 @@ class TypeDecoder {
737738 ++firstChildIdx;
738739 }
739740
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-
761741 FunctionMetadataDifferentiabilityKind diffKind;
762742 if (Node->getChild (firstChildIdx)->getKind () ==
763743 NodeKind::DifferentiableFunctionType) {
@@ -783,6 +763,27 @@ class TypeDecoder {
783763 ++firstChildIdx;
784764 }
785765
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+
786787 flags = flags.withConcurrent (isSendable)
787788 .withAsync (isAsync).withThrows (isThrow)
788789 .withDifferentiable (diffKind.isDifferentiable ());
@@ -1370,33 +1371,44 @@ class TypeDecoder {
13701371 FunctionParam<BuiltType> ¶m) -> bool {
13711372 Demangle::NodePointer node = typeNode;
13721373
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 ;
13821382
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 ;
13861388
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 ;
13901394
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 ;
13971400
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+ }
14001412 }
14011413
14021414 auto paramType = decodeMangledType (node);
0 commit comments