patch 7.4.2072
Problem:    substitute() does not support a Funcref argument.
Solution:   Support a Funcref like it supports  a string starting with "\=".
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 00b1577..54b5a53 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -11061,14 +11061,21 @@
 
     char_u	*str = get_tv_string_chk(&argvars[0]);
     char_u	*pat = get_tv_string_buf_chk(&argvars[1], patbuf);
-    char_u	*sub = get_tv_string_buf_chk(&argvars[2], subbuf);
+    char_u	*sub = NULL;
+    typval_T	*expr = NULL;
     char_u	*flg = get_tv_string_buf_chk(&argvars[3], flagsbuf);
 
+    if (argvars[2].v_type == VAR_FUNC || argvars[2].v_type == VAR_PARTIAL)
+	expr = &argvars[2];
+    else
+	sub = get_tv_string_buf_chk(&argvars[2], subbuf);
+
     rettv->v_type = VAR_STRING;
-    if (str == NULL || pat == NULL || sub == NULL || flg == NULL)
+    if (str == NULL || pat == NULL || (sub == NULL && expr == NULL)
+								|| flg == NULL)
 	rettv->vval.v_string = NULL;
     else
-	rettv->vval.v_string = do_string_sub(str, pat, sub, flg);
+	rettv->vval.v_string = do_string_sub(str, pat, sub, expr, flg);
 }
 
 /*