diff --git a/src/common.cpp b/src/common.cpp index ac2492805..d7182e6b6 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -1363,7 +1363,11 @@ static bool unescape_string_internal(const wchar_t *const input, const size_t in } case L'}': { if (unescape_special) { - assert(brace_count > 0 && "imbalanced brackets are a tokenizer error, we shouldn't be able to get here"); + // HACK: The completion machinery sometimes hands us partial tokens. + // We can't parse them properly, but it shouldn't hurt, + // so we don't assert here. + // See #4954. + // assert(brace_count > 0 && "imbalanced brackets are a tokenizer error, we shouldn't be able to get here"); brace_count--; brace_text_start = brace_text_start && brace_count > 0; to_append_or_none = BRACE_END; diff --git a/src/complete.cpp b/src/complete.cpp index 1df55e5a6..c256a0558 100644 --- a/src/complete.cpp +++ b/src/complete.cpp @@ -1078,6 +1078,9 @@ void completer_t::complete_param_expand(const wcstring &str, bool do_file, bool complete_from_start = !complete_from_separator || !string_prefixes_string(L"-", str); if (complete_from_separator) { + // FIXME: This just cuts the token, + // so any quoting or braces gets lost. + // See #4954. const wcstring sep_string = wcstring(str, sep_index + 1); std::vector local_completions; if (expand_string(sep_string, &local_completions, flags, NULL) == EXPAND_ERROR) {