diff --git a/src/parse_util.cpp b/src/parse_util.cpp index 2551068f3..34bd6c209 100644 --- a/src/parse_util.cpp +++ b/src/parse_util.cpp @@ -1118,13 +1118,14 @@ static bool detect_errors_in_decorated_statement(const wcstring &buff_src, const wcstring &unexp_command = dst.command.source(buff_src, storage); if (!unexp_command.empty()) { - wcstring command; // Check that we can expand the command. + // Make a new error list so we can fix the offset for just those, then append later. + wcstring command; + parse_error_list_t new_errors; if (expand_to_command_and_args(unexp_command, operation_context_t::empty(), &command, - nullptr, parse_errors, + nullptr, &new_errors, true /* skip wildcards */) == expand_result_t::error) { errored = true; - parse_error_offset_source_start(parse_errors, source_start); } // Check that pipes are sound. @@ -1174,6 +1175,11 @@ static bool detect_errors_in_decorated_statement(const wcstring &buff_src, unexp_command.c_str()); } } + + if (parse_errors) { + parse_error_offset_source_start(&new_errors, source_start); + vec_append(*parse_errors, std::move(new_errors)); + } } return errored; } diff --git a/tests/checks/syntax-error-location.fish b/tests/checks/syntax-error-location.fish index 59e7c95c3..22e281170 100644 --- a/tests/checks/syntax-error-location.fish +++ b/tests/checks/syntax-error-location.fish @@ -10,3 +10,15 @@ $status # CHECK: # CHECK: # CHECK: < ^> + +echo ' + +(true one) +(true two) + +# more things +' | $fish 2>| string replace -r '(.*)' '<$1>' + +# CHECK: +# CHECK: <(true one)> +# CHECK: <^>