diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp --- a/lldb/source/Expression/UserExpression.cpp +++ b/lldb/source/Expression/UserExpression.cpp @@ -302,19 +302,19 @@ } if (!parse_success) { - if (!fixed_expression->empty() && target->GetEnableNotifyAboutFixIts()) { - error.SetExpressionErrorWithFormat( - execution_results, - "expression failed to parse, fixed expression suggested:\n %s", - fixed_expression->c_str()); - } else { - if (!diagnostic_manager.Diagnostics().size()) - error.SetExpressionError(execution_results, - "expression failed to parse, unknown error"); + std::string msg; + { + llvm::raw_string_ostream os(msg); + os << "expression failed to parse:\n"; + if (!diagnostic_manager.Diagnostics().empty()) + os << diagnostic_manager.GetString(); else - error.SetExpressionError(execution_results, - diagnostic_manager.GetString().c_str()); + os << "unknown error"; + if (target->GetEnableNotifyAboutFixIts() && fixed_expression && + !fixed_expression->empty()) + os << "\nfixed expression suggested:\n " << *fixed_expression; } + error.SetExpressionError(execution_results, msg.c_str()); } } diff --git a/lldb/test/API/commands/expression/fixits/TestFixIts.py b/lldb/test/API/commands/expression/fixits/TestFixIts.py --- a/lldb/test/API/commands/expression/fixits/TestFixIts.py +++ b/lldb/test/API/commands/expression/fixits/TestFixIts.py @@ -132,25 +132,25 @@ # Disable retries which will fail. multiple_runs_options.SetRetriesWithFixIts(0) value = frame.EvaluateExpression(two_runs_expr, multiple_runs_options) - self.assertIn("expression failed to parse, fixed expression suggested:", - value.GetError().GetCString()) - self.assertIn("using typename T::TypeDef", - value.GetError().GetCString()) + errmsg = value.GetError().GetCString() + self.assertIn("expression failed to parse", errmsg) + self.assertIn("using declaration resolved to type without 'typename'", + errmsg) + self.assertIn("fixed expression suggested:", errmsg) + self.assertIn("using typename T::TypeDef", errmsg) # The second Fix-It shouldn't be suggested here as Clang should have # aborted the parsing process. - self.assertNotIn("i->m", - value.GetError().GetCString()) + self.assertNotIn("i->m", errmsg) # Retry once, but the expression needs two retries. multiple_runs_options.SetRetriesWithFixIts(1) value = frame.EvaluateExpression(two_runs_expr, multiple_runs_options) - self.assertIn("expression failed to parse, fixed expression suggested:", - value.GetError().GetCString()) + errmsg = value.GetError().GetCString() + self.assertIn("expression failed to parse", errmsg) + self.assertIn("fixed expression suggested:", errmsg) # Both our fixed expressions should be in the suggested expression. - self.assertIn("using typename T::TypeDef", - value.GetError().GetCString()) - self.assertIn("i->m", - value.GetError().GetCString()) + self.assertIn("using typename T::TypeDef", errmsg) + self.assertIn("i->m", errmsg) # Retry twice, which will get the expression working. multiple_runs_options.SetRetriesWithFixIts(2)