patch 8.1.1588: in :let-heredoc line continuation is recognized

Problem:    In :let-heredoc line continuation is recognized.
Solution:   Do not consume line continuation. (Ozaki Kiichi, closes #4580)
This commit is contained in:
Bram Moolenaar
2019-06-25 04:12:16 +02:00
parent 2b044ffb5a
commit e96a2498f9
20 changed files with 70 additions and 47 deletions

View File

@@ -2329,7 +2329,7 @@ auto_next_pat(
* Returns allocated string, or NULL for end of autocommands. * Returns allocated string, or NULL for end of autocommands.
*/ */
char_u * char_u *
getnextac(int c UNUSED, void *cookie, int indent UNUSED) getnextac(int c UNUSED, void *cookie, int indent UNUSED, int do_concat UNUSED)
{ {
AutoPatCmd *acp = (AutoPatCmd *)cookie; AutoPatCmd *acp = (AutoPatCmd *)cookie;
char_u *retval; char_u *retval;

View File

@@ -2378,7 +2378,7 @@ ex_loadkeymap(exarg_T *eap)
*/ */
for (;;) for (;;)
{ {
line = eap->getline(0, eap->cookie, 0); line = eap->getline(0, eap->cookie, 0, TRUE);
if (line == NULL) if (line == NULL)
break; break;

View File

@@ -1307,7 +1307,7 @@ heredoc_get(exarg_T *eap, char_u *cmd)
int mi = 0; int mi = 0;
int ti = 0; int ti = 0;
theline = eap->getline(NUL, eap->cookie, 0); theline = eap->getline(NUL, eap->cookie, 0, FALSE);
if (theline == NULL) if (theline == NULL)
{ {
semsg(_("E990: Missing end marker '%s'"), marker); semsg(_("E990: Missing end marker '%s'"), marker);

View File

@@ -3234,7 +3234,8 @@ execute_redir_str(char_u *value, int value_len)
get_list_line( get_list_line(
int c UNUSED, int c UNUSED,
void *cookie, void *cookie,
int indent UNUSED) int indent UNUSED,
int do_concat UNUSED)
{ {
listitem_T **p = (listitem_T **)cookie; listitem_T **p = (listitem_T **)cookie;
listitem_T *item = *p; listitem_T *item = *p;

View File

@@ -4540,7 +4540,7 @@ ex_append(exarg_T *eap)
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
eap->cstack->cs_looplevel > 0 ? -1 : eap->cstack->cs_looplevel > 0 ? -1 :
#endif #endif
NUL, eap->cookie, indent); NUL, eap->cookie, indent, TRUE);
State = save_State; State = save_State;
} }
lines_left = Rows - 1; lines_left = Rows - 1;
@@ -5388,7 +5388,7 @@ do_sub(exarg_T *eap)
for ( ; i <= (long)ec; ++i) for ( ; i <= (long)ec; ++i)
msg_putchar('^'); msg_putchar('^');
resp = getexmodeline('?', NULL, 0); resp = getexmodeline('?', NULL, 0, TRUE);
if (resp != NULL) if (resp != NULL)
{ {
typed = *resp; typed = *resp;

View File

@@ -1837,7 +1837,7 @@ struct exarg
int bad_char; /* BAD_KEEP, BAD_DROP or replacement byte */ int bad_char; /* BAD_KEEP, BAD_DROP or replacement byte */
int useridx; /* user command index */ int useridx; /* user command index */
char *errmsg; /* returned error message */ char *errmsg; /* returned error message */
char_u *(*getline)(int, void *, int); char_u *(*getline)(int, void *, int, int);
void *cookie; /* argument for getline() */ void *cookie; /* argument for getline() */
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
struct condstack *cstack; /* condition stack for ":if" etc. */ struct condstack *cstack; /* condition stack for ":if" etc. */

View File

@@ -371,6 +371,7 @@ check_due_timer(void)
int save_trylevel = trylevel; int save_trylevel = trylevel;
int save_did_throw = did_throw; int save_did_throw = did_throw;
int save_ex_pressedreturn = get_pressedreturn(); int save_ex_pressedreturn = get_pressedreturn();
int save_may_garbage_collect = may_garbage_collect;
except_T *save_current_exception = current_exception; except_T *save_current_exception = current_exception;
vimvars_save_T vvsave; vimvars_save_T vvsave;
@@ -385,7 +386,9 @@ check_due_timer(void)
trylevel = 0; trylevel = 0;
did_throw = FALSE; did_throw = FALSE;
current_exception = NULL; current_exception = NULL;
may_garbage_collect = FALSE;
save_vimvars(&vvsave); save_vimvars(&vvsave);
timer->tr_firing = TRUE; timer->tr_firing = TRUE;
timer_callback(timer); timer_callback(timer);
timer->tr_firing = FALSE; timer->tr_firing = FALSE;
@@ -407,6 +410,7 @@ check_due_timer(void)
must_redraw = must_redraw > save_must_redraw must_redraw = must_redraw > save_must_redraw
? must_redraw : save_must_redraw; ? must_redraw : save_must_redraw;
set_pressedreturn(save_ex_pressedreturn); set_pressedreturn(save_ex_pressedreturn);
may_garbage_collect = save_may_garbage_collect;
/* Only fire the timer again if it repeats and stop_timer() wasn't /* Only fire the timer again if it repeats and stop_timer() wasn't
* called while inside the callback (tr_id == -1). */ * called while inside the callback (tr_id == -1). */
@@ -3611,7 +3615,7 @@ do_source(
cookie.conv.vc_type = CONV_NONE; /* no conversion */ cookie.conv.vc_type = CONV_NONE; /* no conversion */
/* Read the first line so we can check for a UTF-8 BOM. */ /* Read the first line so we can check for a UTF-8 BOM. */
firstline = getsourceline(0, (void *)&cookie, 0); firstline = getsourceline(0, (void *)&cookie, 0, TRUE);
if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
&& firstline[1] == 0xbb && firstline[2] == 0xbf) && firstline[1] == 0xbb && firstline[2] == 0xbf)
{ {
@@ -3794,7 +3798,7 @@ free_scriptnames(void)
* Return NULL for end-of-file or some error. * Return NULL for end-of-file or some error.
*/ */
char_u * char_u *
getsourceline(int c UNUSED, void *cookie, int indent UNUSED) getsourceline(int c UNUSED, void *cookie, int indent UNUSED, int do_concat)
{ {
struct source_cookie *sp = (struct source_cookie *)cookie; struct source_cookie *sp = (struct source_cookie *)cookie;
char_u *line; char_u *line;
@@ -3833,7 +3837,7 @@ getsourceline(int c UNUSED, void *cookie, int indent UNUSED)
/* Only concatenate lines starting with a \ when 'cpoptions' doesn't /* Only concatenate lines starting with a \ when 'cpoptions' doesn't
* contain the 'C' flag. */ * contain the 'C' flag. */
if (line != NULL && (vim_strchr(p_cpo, CPO_CONCAT) == NULL)) if (line != NULL && do_concat && vim_strchr(p_cpo, CPO_CONCAT) == NULL)
{ {
/* compensate for the one line read-ahead */ /* compensate for the one line read-ahead */
--sourcing_lnum; --sourcing_lnum;
@@ -4212,7 +4216,7 @@ do_finish(exarg_T *eap, int reanimate)
*/ */
int int
source_finished( source_finished(
char_u *(*fgetline)(int, void *, int), char_u *(*fgetline)(int, void *, int, int),
void *cookie) void *cookie)
{ {
return (getline_equal(fgetline, cookie, getsourceline) return (getline_equal(fgetline, cookie, getsourceline)

View File

@@ -20,9 +20,9 @@ static int ex_pressedreturn = FALSE;
#endif #endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
static char_u *do_one_cmd(char_u **, int, struct condstack *, char_u *(*fgetline)(int, void *, int), void *cookie); static char_u *do_one_cmd(char_u **, int, struct condstack *, char_u *(*fgetline)(int, void *, int, int), void *cookie);
#else #else
static char_u *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int), void *cookie); static char_u *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int, int), void *cookie);
static int if_level = 0; /* depth in :if */ static int if_level = 0; /* depth in :if */
#endif #endif
static void free_cmdmod(void); static void free_cmdmod(void);
@@ -431,11 +431,11 @@ struct loop_cookie
int current_line; /* last read line from growarray */ int current_line; /* last read line from growarray */
int repeating; /* TRUE when looping a second time */ int repeating; /* TRUE when looping a second time */
/* When "repeating" is FALSE use "getline" and "cookie" to get lines */ /* When "repeating" is FALSE use "getline" and "cookie" to get lines */
char_u *(*getline)(int, void *, int); char_u *(*getline)(int, void *, int, int);
void *cookie; void *cookie;
}; };
static char_u *get_loop_line(int c, void *cookie, int indent); static char_u *get_loop_line(int c, void *cookie, int indent, int do_concat);
static int store_loop_line(garray_T *gap, char_u *line); static int store_loop_line(garray_T *gap, char_u *line);
static void free_cmdlines(garray_T *gap); static void free_cmdlines(garray_T *gap);
@@ -619,7 +619,7 @@ do_cmdline_cmd(char_u *cmd)
int int
do_cmdline( do_cmdline(
char_u *cmdline, char_u *cmdline,
char_u *(*fgetline)(int, void *, int), char_u *(*fgetline)(int, void *, int, int),
void *cookie, /* argument for fgetline() */ void *cookie, /* argument for fgetline() */
int flags) int flags)
{ {
@@ -644,7 +644,7 @@ do_cmdline(
struct msglist *private_msg_list; struct msglist *private_msg_list;
/* "fgetline" and "cookie" passed to do_one_cmd() */ /* "fgetline" and "cookie" passed to do_one_cmd() */
char_u *(*cmd_getline)(int, void *, int); char_u *(*cmd_getline)(int, void *, int, int);
void *cmd_cookie; void *cmd_cookie;
struct loop_cookie cmd_loop_cookie; struct loop_cookie cmd_loop_cookie;
void *real_cookie; void *real_cookie;
@@ -894,7 +894,7 @@ do_cmdline(
#else #else
0 0
#endif #endif
)) == NULL) , TRUE)) == NULL)
{ {
/* Don't call wait_return for aborted command line. The NULL /* Don't call wait_return for aborted command line. The NULL
* returned for the end of a sourced file or executed function * returned for the end of a sourced file or executed function
@@ -1424,7 +1424,7 @@ do_cmdline(
* Obtain a line when inside a ":while" or ":for" loop. * Obtain a line when inside a ":while" or ":for" loop.
*/ */
static char_u * static char_u *
get_loop_line(int c, void *cookie, int indent) get_loop_line(int c, void *cookie, int indent, int do_concat)
{ {
struct loop_cookie *cp = (struct loop_cookie *)cookie; struct loop_cookie *cp = (struct loop_cookie *)cookie;
wcmd_T *wp; wcmd_T *wp;
@@ -1437,9 +1437,9 @@ get_loop_line(int c, void *cookie, int indent)
/* First time inside the ":while"/":for": get line normally. */ /* First time inside the ":while"/":for": get line normally. */
if (cp->getline == NULL) if (cp->getline == NULL)
line = getcmdline(c, 0L, indent); line = getcmdline(c, 0L, indent, do_concat);
else else
line = cp->getline(c, cp->cookie, indent); line = cp->getline(c, cp->cookie, indent, do_concat);
if (line != NULL && store_loop_line(cp->lines_gap, line) == OK) if (line != NULL && store_loop_line(cp->lines_gap, line) == OK)
++cp->current_line; ++cp->current_line;
@@ -1487,12 +1487,12 @@ free_cmdlines(garray_T *gap)
*/ */
int int
getline_equal( getline_equal(
char_u *(*fgetline)(int, void *, int), char_u *(*fgetline)(int, void *, int, int),
void *cookie UNUSED, /* argument for fgetline() */ void *cookie UNUSED, /* argument for fgetline() */
char_u *(*func)(int, void *, int)) char_u *(*func)(int, void *, int, int))
{ {
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
char_u *(*gp)(int, void *, int); char_u *(*gp)(int, void *, int, int);
struct loop_cookie *cp; struct loop_cookie *cp;
/* When "fgetline" is "get_loop_line()" use the "cookie" to find the /* When "fgetline" is "get_loop_line()" use the "cookie" to find the
@@ -1517,11 +1517,11 @@ getline_equal(
*/ */
void * void *
getline_cookie( getline_cookie(
char_u *(*fgetline)(int, void *, int) UNUSED, char_u *(*fgetline)(int, void *, int, int) UNUSED,
void *cookie) /* argument for fgetline() */ void *cookie) /* argument for fgetline() */
{ {
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
char_u *(*gp)(int, void *, int); char_u *(*gp)(int, void *, int, int);
struct loop_cookie *cp; struct loop_cookie *cp;
/* When "fgetline" is "get_loop_line()" use the "cookie" to find the /* When "fgetline" is "get_loop_line()" use the "cookie" to find the
@@ -1654,7 +1654,7 @@ do_one_cmd(
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
struct condstack *cstack, struct condstack *cstack,
#endif #endif
char_u *(*fgetline)(int, void *, int), char_u *(*fgetline)(int, void *, int, int),
void *cookie) /* argument for fgetline() */ void *cookie) /* argument for fgetline() */
{ {
char_u *p; char_u *p;

View File

@@ -838,7 +838,8 @@ cmdline_init(void)
getcmdline( getcmdline(
int firstc, int firstc,
long count, // only used for incremental search long count, // only used for incremental search
int indent) // indent for inside conditionals int indent, // indent for inside conditionals
int do_concat UNUSED)
{ {
return getcmdline_int(firstc, count, indent, TRUE); return getcmdline_int(firstc, count, indent, TRUE);
} }
@@ -2687,12 +2688,13 @@ correct_cmdspos(int idx, int cells)
getexline( getexline(
int c, /* normally ':', NUL for ":append" */ int c, /* normally ':', NUL for ":append" */
void *cookie UNUSED, void *cookie UNUSED,
int indent) /* indent for inside conditionals */ int indent, /* indent for inside conditionals */
int do_concat)
{ {
/* When executing a register, remove ':' that's in front of each line. */ /* When executing a register, remove ':' that's in front of each line. */
if (exec_from_reg && vpeekc() == ':') if (exec_from_reg && vpeekc() == ':')
(void)vgetc(); (void)vgetc();
return getcmdline(c, 1L, indent); return getcmdline(c, 1L, indent, do_concat);
} }
/* /*
@@ -2706,7 +2708,8 @@ getexmodeline(
int promptc, /* normally ':', NUL for ":append" and '?' for int promptc, /* normally ':', NUL for ":append" and '?' for
:s prompt */ :s prompt */
void *cookie UNUSED, void *cookie UNUSED,
int indent) /* indent for inside conditionals */ int indent, /* indent for inside conditionals */
int do_concat UNUSED)
{ {
garray_T line_ga; garray_T line_ga;
char_u *pend; char_u *pend;
@@ -7409,7 +7412,7 @@ script_get(exarg_T *eap, char_u *cmd)
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
eap->cstack->cs_looplevel > 0 ? -1 : eap->cstack->cs_looplevel > 0 ? -1 :
#endif #endif
NUL, eap->cookie, 0); NUL, eap->cookie, 0, TRUE);
if (theline == NULL || STRCMP(end_pattern, theline) == 0) if (theline == NULL || STRCMP(end_pattern, theline) == 0)
{ {

View File

@@ -6237,7 +6237,7 @@ nv_search(cmdarg_T *cap)
/* When using 'incsearch' the cursor may be moved to set a different search /* When using 'incsearch' the cursor may be moved to set a different search
* start position. */ * start position. */
cap->searchbuf = getcmdline(cap->cmdchar, cap->count1, 0); cap->searchbuf = getcmdline(cap->cmdchar, cap->count1, 0, TRUE);
if (cap->searchbuf == NULL) if (cap->searchbuf == NULL)
{ {

View File

@@ -788,7 +788,7 @@ get_expr_register(void)
{ {
char_u *new_line; char_u *new_line;
new_line = getcmdline('=', 0L, 0); new_line = getcmdline('=', 0L, 0, TRUE);
if (new_line == NULL) if (new_line == NULL)
return NUL; return NUL;
if (*new_line == NUL) /* use previous line */ if (*new_line == NUL) /* use previous line */

View File

@@ -30,7 +30,7 @@ int has_completechanged(void);
void block_autocmds(void); void block_autocmds(void);
void unblock_autocmds(void); void unblock_autocmds(void);
int is_autocmd_blocked(void); int is_autocmd_blocked(void);
char_u *getnextac(int c, void *cookie, int indent); char_u *getnextac(int c, void *cookie, int indent, int do_concat);
int has_autocmd(event_T event, char_u *sfname, buf_T *buf); int has_autocmd(event_T event, char_u *sfname, buf_T *buf);
char_u *get_augroup_name(expand_T *xp, int idx); char_u *get_augroup_name(expand_T *xp, int idx);
char_u *set_context_in_autocmd(expand_T *xp, char_u *arg, int doautocmd); char_u *set_context_in_autocmd(expand_T *xp, char_u *arg, int doautocmd);

View File

@@ -81,7 +81,7 @@ void ex_scriptnames(exarg_T *eap);
void scriptnames_slash_adjust(void); void scriptnames_slash_adjust(void);
char_u *get_scriptname(scid_T id); char_u *get_scriptname(scid_T id);
void free_scriptnames(void); void free_scriptnames(void);
char_u *getsourceline(int c, void *cookie, int indent); char_u *getsourceline(int c, void *cookie, int indent, int do_concat);
void script_line_start(void); void script_line_start(void);
void script_line_exec(void); void script_line_exec(void);
void script_line_end(void); void script_line_end(void);
@@ -89,7 +89,7 @@ void ex_scriptencoding(exarg_T *eap);
void ex_scriptversion(exarg_T *eap); void ex_scriptversion(exarg_T *eap);
void ex_finish(exarg_T *eap); void ex_finish(exarg_T *eap);
void do_finish(exarg_T *eap, int reanimate); void do_finish(exarg_T *eap, int reanimate);
int source_finished(char_u *(*fgetline)(int, void *, int), void *cookie); int source_finished(char_u *(*fgetline)(int, void *, int, int), void *cookie);
void ex_checktime(exarg_T *eap); void ex_checktime(exarg_T *eap);
char_u *get_mess_lang(void); char_u *get_mess_lang(void);
void set_lang_var(void); void set_lang_var(void);

View File

@@ -1,9 +1,9 @@
/* ex_docmd.c */ /* ex_docmd.c */
void do_exmode(int improved); void do_exmode(int improved);
int do_cmdline_cmd(char_u *cmd); int do_cmdline_cmd(char_u *cmd);
int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int), void *cookie, int flags); int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int, int), void *cookie, int flags);
int getline_equal(char_u *(*fgetline)(int, void *, int), void *cookie, char_u *(*func)(int, void *, int)); int getline_equal(char_u *(*fgetline)(int, void *, int, int), void *cookie, char_u *(*func)(int, void *, int, int));
void *getline_cookie(char_u *(*fgetline)(int, void *, int), void *cookie); void *getline_cookie(char_u *(*fgetline)(int, void *, int, int), void *cookie);
int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only); int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent); int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
int checkforcmd(char_u **pp, char *cmd, int len); int checkforcmd(char_u **pp, char *cmd, int len);

View File

@@ -1,14 +1,14 @@
/* ex_getln.c */ /* ex_getln.c */
void cmdline_init(void); void cmdline_init(void);
char_u *getcmdline(int firstc, long count, int indent); char_u *getcmdline(int firstc, long count, int indent, int do_concat);
char_u *getcmdline_prompt(int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg); char_u *getcmdline_prompt(int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg);
int text_locked(void); int text_locked(void);
void text_locked_msg(void); void text_locked_msg(void);
char *get_text_locked_msg(void); char *get_text_locked_msg(void);
int curbuf_locked(void); int curbuf_locked(void);
int allbuf_locked(void); int allbuf_locked(void);
char_u *getexline(int c, void *cookie, int indent); char_u *getexline(int c, void *cookie, int indent, int do_concat);
char_u *getexmodeline(int promptc, void *cookie, int indent); char_u *getexmodeline(int promptc, void *cookie, int indent, int do_concat);
int cmdline_overstrike(void); int cmdline_overstrike(void);
int cmdline_at_end(void); int cmdline_at_end(void);
colnr_T cmdline_getvcol_cursor(void); colnr_T cmdline_getvcol_cursor(void);

View File

@@ -30,7 +30,7 @@ void ex_call(exarg_T *eap);
int do_return(exarg_T *eap, int reanimate, int is_cmd, void *rettv); int do_return(exarg_T *eap, int reanimate, int is_cmd, void *rettv);
void discard_pending_return(void *rettv); void discard_pending_return(void *rettv);
char_u *get_return_cmd(void *rettv); char_u *get_return_cmd(void *rettv);
char_u *get_func_line(int c, void *cookie, int indent); char_u *get_func_line(int c, void *cookie, int indent, int do_concat);
void func_line_start(void *cookie); void func_line_start(void *cookie);
void func_line_exec(void *cookie); void func_line_exec(void *cookie);
void func_line_end(void *cookie); void func_line_end(void *cookie);

View File

@@ -237,6 +237,14 @@ END
END END
call assert_equal(['something', 'endfunc'], var1) call assert_equal(['something', 'endfunc'], var1)
" not concatenate lines
let var1 =<< END
some
\thing
\ else
END
call assert_equal(['some', ' \thing', ' \ else'], var1)
" ignore "python << xx" " ignore "python << xx"
let var1 =<<END let var1 =<<END
something something

View File

@@ -157,6 +157,7 @@ endfunc
" horizontally or vertically. " horizontally or vertically.
func Test_o_arg() func Test_o_arg()
let after =<< trim [CODE] let after =<< trim [CODE]
set cpo&vim
call writefile([winnr("$"), call writefile([winnr("$"),
\ winheight(1), winheight(2), &lines, \ winheight(1), winheight(2), &lines,
\ winwidth(1), winwidth(2), &columns, \ winwidth(1), winwidth(2), &columns,

View File

@@ -2007,6 +2007,7 @@ ex_function(exarg_T *eap)
hashtab_T *ht; hashtab_T *ht;
int todo; int todo;
hashitem_T *hi; hashitem_T *hi;
int do_concat = TRUE;
int sourcing_lnum_off; int sourcing_lnum_off;
/* /*
@@ -2303,9 +2304,9 @@ ex_function(exarg_T *eap)
{ {
vim_free(line_to_free); vim_free(line_to_free);
if (eap->getline == NULL) if (eap->getline == NULL)
theline = getcmdline(':', 0L, indent); theline = getcmdline(':', 0L, indent, do_concat);
else else
theline = eap->getline(':', eap->cookie, indent); theline = eap->getline(':', eap->cookie, indent, do_concat);
line_to_free = theline; line_to_free = theline;
} }
if (KeyTyped) if (KeyTyped)
@@ -2334,6 +2335,7 @@ ex_function(exarg_T *eap)
{ {
VIM_CLEAR(skip_until); VIM_CLEAR(skip_until);
VIM_CLEAR(trimmed); VIM_CLEAR(trimmed);
do_concat = TRUE;
} }
} }
} }
@@ -2458,6 +2460,7 @@ ex_function(exarg_T *eap)
skip_until = vim_strsave((char_u *)"."); skip_until = vim_strsave((char_u *)".");
else else
skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p)); skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p));
do_concat = FALSE;
} }
} }
@@ -3511,7 +3514,8 @@ get_return_cmd(void *rettv)
get_func_line( get_func_line(
int c UNUSED, int c UNUSED,
void *cookie, void *cookie,
int indent UNUSED) int indent UNUSED,
int do_concat UNUSED)
{ {
funccall_T *fcp = (funccall_T *)cookie; funccall_T *fcp = (funccall_T *)cookie;
ufunc_T *fp = fcp->func; ufunc_T *fp = fcp->func;

View File

@@ -777,6 +777,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1588,
/**/ /**/
1587, 1587,
/**/ /**/