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: ^~~~~~~~~~~~~~~~~~^