diff --git a/lib/Demangling/NodePrinter.cpp b/lib/Demangling/NodePrinter.cpp index 4f7cbbf24470e..15a268e8b2f83 100644 --- a/lib/Demangling/NodePrinter.cpp +++ b/lib/Demangling/NodePrinter.cpp @@ -1265,6 +1265,8 @@ void NodePrinter::printFunctionSigSpecializationParams(NodePointer Node, break; case FunctionSigSpecializationParamKind::ConstantPropFunction: case FunctionSigSpecializationParamKind::ConstantPropGlobal: { + if (Idx + 2 > End) + return; Printer << "["; print(Node->getChild(Idx++), depth + 1); Printer << " : "; @@ -1280,6 +1282,8 @@ void NodePrinter::printFunctionSigSpecializationParams(NodePointer Node, } case FunctionSigSpecializationParamKind::ConstantPropInteger: case FunctionSigSpecializationParamKind::ConstantPropFloat: + if (Idx + 2 > End) + return; Printer << "["; print(Node->getChild(Idx++), depth + 1); Printer << " : "; @@ -1287,6 +1291,8 @@ void NodePrinter::printFunctionSigSpecializationParams(NodePointer Node, Printer << "]"; break; case FunctionSigSpecializationParamKind::ConstantPropString: + if (Idx + 3 > End) + return; Printer << "["; print(Node->getChild(Idx++), depth + 1); Printer << " : "; @@ -1297,6 +1303,8 @@ void NodePrinter::printFunctionSigSpecializationParams(NodePointer Node, Printer << "]"; break; case FunctionSigSpecializationParamKind::ConstantPropKeyPath: + if (Idx + 4 > End) + return; Printer << "["; print(Node->getChild(Idx++), depth + 1); Printer << " : "; @@ -1308,6 +1316,8 @@ void NodePrinter::printFunctionSigSpecializationParams(NodePointer Node, Printer << ">]"; break; case FunctionSigSpecializationParamKind::ClosureProp: + if (Idx + 2 > End) + return; Printer << "["; print(Node->getChild(Idx++), depth + 1); Printer << " : "; diff --git a/test/Demangle/Inputs/manglings.txt b/test/Demangle/Inputs/manglings.txt index 4818f9a2808fc..3bb986765a1f7 100644 --- a/test/Demangle/Inputs/manglings.txt +++ b/test/Demangle/Inputs/manglings.txt @@ -420,6 +420,7 @@ $s4test3fooyyS2f_SfYkztYjrXEF ---> test.foo(@differentiable(reverse) (Swift.Floa $s4test3fooyyS2f_SfYkntYjrXEF ---> test.foo(@differentiable(reverse) (Swift.Float, __owned @noDerivative Swift.Float) -> Swift.Float) -> () $s4test3fooyyS2f_SfYktYjrXEF ---> test.foo(@differentiable(reverse) (Swift.Float, @noDerivative Swift.Float) -> Swift.Float) -> () $s4test3fooyyS2f_SfYktYaYbYjrXEF ---> test.foo(@differentiable(reverse) @Sendable (Swift.Float, @noDerivative Swift.Float) async -> Swift.Float) -> () +$SSSTf4pd44444_pf ---> function signature specialization of Swift.String $sScA ---> Swift.Actor $sScGySiG ---> Swift.TaskGroup $s4test10returnsOptyxycSgxyScMYccSglF ---> test.returnsOpt((@Swift.MainActor () -> A)?) -> (() -> A)?