call assert_fails('com DoCmd :', 'E174:')
comclear
call assert_fails('delcom DoCmd', 'E184:')
+
+ " These used to leak memory
+ call assert_fails('com! -complete=custom,CustomComplete _ :', 'E182:')
+ call assert_fails('com! -complete=custom,CustomComplete docmd :', 'E183:')
+ call assert_fails('com! -complete=custom,CustomComplete -xxx DoCmd :', 'E181:')
endfunc
func CustomComplete(A, L, P)
end = skiptowhite(p);
if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl,
&compl_arg, &addr_type_arg) == FAIL)
- return;
+ goto theend;
p = skipwhite(end);
}
if (!ends_excmd2(eap->arg, p) && !VIM_ISWHITE(*p))
{
emsg(_(e_invalid_command_name));
- return;
+ goto theend;
}
end = p;
name_len = (int)(end - name);
// we are listing commands
p = skipwhite(end);
if (!has_attr && ends_excmd2(eap->arg, p))
+ {
uc_list(name, end - name);
+ }
else if (!ASCII_ISUPPER(*name))
+ {
emsg(_(e_user_defined_commands_must_start_with_an_uppercase_letter));
+ }
else if ((name_len == 1 && *name == 'X')
|| (name_len <= 4
&& STRNCMP(name, "Next", name_len > 4 ? 4 : name_len) == 0))
+ {
emsg(_(e_reserved_name_cannot_be_used_for_user_defined_command));
+ }
else if (compl > 0 && (argt & EX_EXTRA) == 0)
{
// Some plugins rely on silently ignoring the mistake, only make this
uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
addr_type_arg, eap->forceit);
vim_free(tofree);
+
+ return; // success
}
+
+theend:
+ vim_free(compl_arg);
}
/*