https://github.com/Michael137 created https://github.com/llvm/llvm-project/pull/177921
Instead of creating a new `UserExpressionSP` for the fix-it expression, just re-use the existing `user_expression_sp`. We used to always reset it when an expression failed, even if no fix-it was available. An upcoming patch will need the `user_expression_sp` to be alive at the point where we set up the diagnostic errors. So this patch removes the unconditional `reset()` on `!parse_success` in favour of resetting it to the new fixed expression, if one is available. >From 0c72faa57ea06bb94eada52642498486d0a79a68 Mon Sep 17 00:00:00 2001 From: Michael Buch <[email protected]> Date: Mon, 26 Jan 2026 08:58:41 +0000 Subject: [PATCH] [lldb][UserExpression] Delay deletion of failed user expression Instead of creating a new `UserExpressionSP` for the fix-it expression, just re-use the existing `user_expression_sp`. We used to always reset it when an expression failed, even if no fix-it was available. An upcoming patch will need the `user_expression_sp` to be alive at the point where we set up the diagnostic errors. So this patch removes the unconditional `reset()` on `!parse_success` in favour of resetting it to the new fixed expression, if one is available. --- lldb/source/Expression/UserExpression.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp index ff7a356dbbb1e..16a6218759f8f 100644 --- a/lldb/source/Expression/UserExpression.cpp +++ b/lldb/source/Expression/UserExpression.cpp @@ -290,34 +290,29 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx, // If there is a fixed expression, try to parse it: if (!parse_success) { - // Delete the expression that failed to parse before attempting to parse - // the next expression. - user_expression_sp.reset(); - execution_results = lldb::eExpressionParseError; if (!fixed_expression->empty() && options.GetAutoApplyFixIts()) { const uint64_t max_fix_retries = options.GetRetriesWithFixIts(); for (uint64_t i = 0; i < max_fix_retries; ++i) { // Try parsing the fixed expression. - lldb::UserExpressionSP fixed_expression_sp( - target->GetUserExpressionForLanguage( - fixed_expression->c_str(), full_prefix, language, desired_type, - options, ctx_obj, error)); - if (!fixed_expression_sp) + user_expression_sp.reset(target->GetUserExpressionForLanguage( + fixed_expression->c_str(), full_prefix, language, desired_type, + options, ctx_obj, error)); + if (!user_expression_sp) break; + DiagnosticManager fixed_diagnostic_manager; - parse_success = fixed_expression_sp->Parse( + parse_success = user_expression_sp->Parse( fixed_diagnostic_manager, exe_ctx, execution_policy, keep_expression_in_memory, generate_debug_info); if (parse_success) { diagnostic_manager.Clear(); - user_expression_sp = fixed_expression_sp; break; } // The fixed expression also didn't parse. Let's check for any new // fixits we could try. - if (!fixed_expression_sp->GetFixedText().empty()) { - *fixed_expression = fixed_expression_sp->GetFixedText().str(); + if (!user_expression_sp->GetFixedText().empty()) { + *fixed_expression = user_expression_sp->GetFixedText().str(); } else { // Fixed expression didn't compile without a fixit, don't retry and // don't tell the user about it. _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
