if (STRNCMP(cmd, "++once", 6) == 0 && VIM_ISWHITE(cmd[6]))
{
if (once)
+ {
semsg(_(e_duplicate_argument_str), "++once");
+ goto err_exit;
+ }
once = TRUE;
cmd = skipwhite(cmd + 6);
}
if (nested)
{
semsg(_(e_duplicate_argument_str), "++nested");
- return;
+ goto err_exit;
}
nested = TRUE;
cmd = skipwhite(cmd + 8);
// be removed and "nested" accepted as the start of the
// command.
emsg(_(e_invalid_command_nested_did_you_mean_plusplus_nested));
- return;
+ goto err_exit;
}
if (nested)
{
semsg(_(e_duplicate_argument_str), "nested");
- return;
+ goto err_exit;
}
nested = TRUE;
cmd = skipwhite(cmd + 6);
cmd = expand_sfile(cmd);
if (cmd == NULL) // some error
- return;
+ goto err_exit;
cmd_need_free = TRUE;
}
}
break;
}
+err_exit:
if (cmd_need_free)
vim_free(cmd);
vim_free(tofree);
close
call assert_fails('au WinNew * ++once ++once echo bad', 'E983:')
+ call assert_false(exists('#WinNew'))
endfunc
+func Test_autocmd_dup_arg()
+ " Duplicate ++once / ++nested, or the legacy "nested" used twice, must
+ " error out *and* not create the autocommand. Using an environment
+ " variable in the pattern also exercises the error-exit path that frees
+ " the expanded pattern (checked by the address/leak sanitizers).
+ augroup XdupTest
+ au!
+ augroup END
+ let $XAUTODIR = 'Xfoo'
+
+ " New behavior: duplicate ++once now aborts, the autocmd is not added
+ call assert_fails('au XdupTest WinNew $XAUTODIR/* ++once ++once echo bad', 'E983:')
+ call assert_false(exists('#XdupTest#WinNew'))
+
+ call assert_fails('au XdupTest WinNew $XAUTODIR/* ++nested ++nested echo bad', 'E983:')
+ call assert_false(exists('#XdupTest#WinNew'))
+
+ call assert_fails('au XdupTest WinNew $XAUTODIR/* nested nested echo bad', 'E983:')
+ call assert_false(exists('#XdupTest#WinNew'))
+
+ " "nested" without "++" is rejected in Vim9 script (also frees the pattern)
+ call assert_fails('vim9cmd au XdupTest WinNew $XAUTODIR/* nested echo bad', 'E1078:')
+ call assert_false(exists('#XdupTest#WinNew'))
+
+ augroup XdupTest
+ au!
+ augroup END
+ augroup! XdupTest
+ let $XAUTODIR = ''
+endfunc
+
+
func Test_autocmd_bufreadpre()
new
let b:bufreadpre = 1