--- a/cmajor++/Cm/Cm.Core/Util.cpp
+++ b/cmajor++/Cm/Cm.Core/Util.cpp
@@ -497,6 +497,31 @@
     return MangleMap::Instance()->Plain(functionSetName);
 }
 
+std::string MakeFunctionTypeName(TypePtr returnType, const std::vector<TypePtr>& parameterTypes)
+{
+    std::string s;
+    if (returnType)
+    {
+        s.append(returnType->FullName()).append(" ");
+    }
+    s.append("(");
+    bool first = true;
+    for (TypePtr paramType : parameterTypes)
+    {
+        if (first)
+        {
+            first = false;
+        }
+        else
+        {
+            s.append(", ");
+        }
+        s.append(paramType->FullName());
+    }
+    s.append(")");
+    return s;
+}
+
 std::string MakeConceptInstanceName(const ConceptPtr& concept, const std::vector<TypePtr>& types)
 {
     std::string typeArgumentList = "<";