Make sure Target::EvaluateExpression() passes up an error instead of silently droppin...
authorAdrian Prantl <aprantl@apple.com>
Fri, 14 Oct 2022 23:45:01 +0000 (16:45 -0700)
committerAdrian Prantl <aprantl@apple.com>
Tue, 18 Oct 2022 00:27:54 +0000 (17:27 -0700)
commitdd5c5f72e00dca0e2458139fec09b1a715cfb238
treecf0bdb2e7001215e5e8cc064c79b9d2db276fbe6
parent2c9093e649c4078c1083f489b72dda7ad54baea5
Make sure Target::EvaluateExpression() passes up an error instead of silently dropping it.

When UserExpression::Evaluate() fails and doesn't return a ValueObject there is no vehicle for returning the error in the return value.

This behavior can be observed by applying the following patch:

diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index f1a311b7252c..58c03ccdb068 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -2370,6 +2370,7 @@ UserExpression *Target::GetUserExpressionForLanguage(
     Expression::ResultType desired_type,
     const EvaluateExpressionOptions &options, ValueObject *ctx_obj,
     Status &error) {
+  error.SetErrorStringWithFormat("Ha ha!");  return nullptr;
   auto type_system_or_err = GetScratchTypeSystemForLanguage(language);
   if (auto err = type_system_or_err.takeError()) {
     error.SetErrorStringWithFormat(

and then running

$ lldb -o "p 1"
(lldb) p 1
(lldb)

This patch fixes this by creating an empty result ValueObject that wraps the error.

Differential Revision: https://reviews.llvm.org/D135998
lldb/source/Commands/CommandObjectExpression.cpp
lldb/source/Target/Target.cpp
lldb/test/API/commands/expression/context-object/TestContextObject.py
lldb/test/API/commands/expression/fixits/TestFixIts.py