function: Also error for read-only var in positional arg

We have this hack where any positional arguments are taken as argument
names if "--argument-names" is given, and that didn't check for
read-only variables.

Fixes #11295

(cherry picked from commit d203ee4d53)
This commit is contained in:
Fabian Boehm
2025-03-17 19:52:09 +01:00
parent 5771085280
commit c7efbf590e
2 changed files with 13 additions and 0 deletions

View File

@@ -92,6 +92,14 @@ fn parse_cmd_opts(
// A positional argument we got because we use RETURN_IN_ORDER.
let woptarg = w.woptarg.unwrap().to_owned();
if handling_named_arguments {
if is_read_only(&woptarg) {
streams.err.append(wgettext_fmt!(
"%ls: variable '%ls' is read-only\n",
cmd,
woptarg
));
return STATUS_INVALID_ARGS;
}
opts.named_arguments.push(woptarg);
} else {
streams.err.append(wgettext_fmt!(

View File

@@ -183,6 +183,11 @@ function foo --argument-names status; end
echo status $status
# CHECK: status 2
function foo --argument-names foo status; end
# CHECKERR: {{.*}}function.fish (line {{\d+}}): function: variable 'status' is read-only
# CHECKERR: function foo --argument-names foo status; end
# CHECKERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
functions -q foo
echo exists $status
# CHECK: exists 1