diff --git a/src/expand.cpp b/src/expand.cpp index e04077d2b..76e3ae8e7 100644 --- a/src/expand.cpp +++ b/src/expand.cpp @@ -665,6 +665,23 @@ static expand_result_t expand_cmdsubst(wcstring input, const operation_context_t case STATUS_NOT_EXECUTABLE: err = L"Command not executable"; break; + case STATUS_INVALID_ARGS: + // TODO: Also overused + // This is sent for: + // invalid redirections or pipes (like `<&foo`), + // invalid variables (invalid name or read-only) for for-loops, + // switch $foo if $foo expands to more than one argument + // time in a background job. + err = L"Invalid arguments"; + break; + case STATUS_EXPAND_ERROR: + // Sent in `for $foo in ...` if $foo expands to more than one word + err = L"Expansion error"; + break; + case STATUS_UNMATCHED_WILDCARD: + // Sent in `for $foo in ...` if $foo expands to more than one word + err = L"Unmatched wildcard"; + break; default: err = L"Unknown error while evaluating command substitution"; break; diff --git a/tests/checks/syntax-error-location.fish b/tests/checks/syntax-error-location.fish index fb6fe03a8..e391bc13b 100644 --- a/tests/checks/syntax-error-location.fish +++ b/tests/checks/syntax-error-location.fish @@ -73,3 +73,48 @@ echo "bind -M" | $fish # CHECKERR: ^ # CHECKERR: (Type 'help bind' for related documentation) +$fish -c 'echo (for status in foo; end)' +# CHECKERR: fish: for: status: cannot overwrite read-only variable +# CHECKERR: for status in foo; end +# CHECKERR: ^~~~~^ +# CHECKERR: in command substitution +# CHECKERR: fish: Invalid arguments +# CHECKERR: echo (for status in foo; end) +# CHECKERR: ^~~~~~~~~~~~~~~~~~~~~~~^ + +$fish -c 'echo (echo <&foo)' +# CHECKERR: fish: Requested redirection to 'foo', which is not a valid file descriptor +# CHECKERR: echo <&foo +# CHECKERR: ^~~~^ +# CHECKERR: in command substitution +# CHECKERR: fish: Invalid arguments +# CHECKERR: echo (echo <&foo) +# CHECKERR: ^~~~~~~~~~~^ + + +$fish -c 'echo (time echo foo &)' +# CHECKERR: fish: 'time' is not supported for background jobs. Consider using 'command time'. +# CHECKERR: time echo foo & +# CHECKERR: ^~~~~~~~~~~~~~^ +# CHECKERR: in command substitution +# CHECKERR: fish: Invalid arguments +# CHECKERR: echo (time echo foo &) +# CHECKERR: ^~~~~~~~~~~~~~~~^ + +$fish -c 'echo (set -l foo 1 2 3; for $foo in foo; end)' +# CHECKERR: fish: Unable to expand variable name '' +# CHECKERR: set -l foo 1 2 3; for $foo in foo; end +# CHECKERR: ^~~^ +# CHECKERR: in command substitution +# CHECKERR: fish: Expansion error +# CHECKERR: echo (set -l foo 1 2 3; for $foo in foo; end) +# CHECKERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ + +$fish -c 'echo (echo *nosuchname*)' +# CHECKERR: fish: No matches for wildcard '*nosuchname*'. See `help wildcards-globbing`. +# CHECKERR: echo *nosuchname* +# CHECKERR: ^~~~~~~~~~~^ +# CHECKERR: in command substitution +# CHECKERR: fish: Unmatched wildcard +# CHECKERR: echo (echo *nosuchname*) +# CHECKERR: ^~~~~~~~~~~~~~~~~~^