diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp index b7d129e1d7df6..be306f20881d2 100644 --- a/lldb/source/Commands/CommandObjectExpression.cpp +++ b/lldb/source/Commands/CommandObjectExpression.cpp @@ -461,6 +461,8 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr, result.SetStatus(eReturnStatusFailed); } } + } else { + error_stream.Printf("error: unknown error\n"); } return (success != eExpressionSetupError && diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index c567407757e39..f1a311b7252cb 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -26,6 +26,7 @@ #include "lldb/Core/StreamFile.h" #include "lldb/Core/StructuredDataImpl.h" #include "lldb/Core/ValueObject.h" +#include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Expression/DiagnosticManager.h" #include "lldb/Expression/ExpressionVariable.h" #include "lldb/Expression/REPL.h" @@ -2528,6 +2529,10 @@ ExpressionResults Target::EvaluateExpression( execution_results = UserExpression::Evaluate(exe_ctx, options, expr, prefix, result_valobj_sp, error, fixed_expression, ctx_obj); + // Pass up the error by wrapping it inside an error result. + if (error.Fail() && !result_valobj_sp) + result_valobj_sp = ValueObjectConstResult::Create( + exe_ctx.GetBestExecutionContextScope(), error); } if (execution_results == eExpressionCompleted) diff --git a/lldb/test/API/commands/expression/context-object/TestContextObject.py b/lldb/test/API/commands/expression/context-object/TestContextObject.py index 45f7a003837b9..7c963ebd846c1 100644 --- a/lldb/test/API/commands/expression/context-object/TestContextObject.py +++ b/lldb/test/API/commands/expression/context-object/TestContextObject.py @@ -67,7 +67,7 @@ def test_context_object(self): # Test an expression evaluation value = obj_val.EvaluateExpression("1") - self.assertFalse(value.IsValid()) + self.assertTrue(value.IsValid()) self.assertFalse(value.GetError().Success()) # @@ -79,7 +79,7 @@ def test_context_object(self): # Test an expression evaluation value = obj_val.EvaluateExpression("1") - self.assertFalse(value.IsValid()) + self.assertTrue(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of an element's field @@ -97,7 +97,7 @@ def test_context_object(self): # Test an expression evaluation value = obj_val.EvaluateExpression("1") - self.assertFalse(value.IsValid()) + self.assertTrue(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of a dereferenced object's field @@ -127,7 +127,7 @@ def test_context_object(self): # Test an expression evaluation value = obj_val.EvaluateExpression("1") - self.assertFalse(value.IsValid()) + self.assertTrue(value.IsValid()) self.assertFalse(value.GetError().Success()) # Test retrieveing of a dereferenced object's field diff --git a/lldb/test/API/commands/expression/fixits/TestFixIts.py b/lldb/test/API/commands/expression/fixits/TestFixIts.py index bcc7e61d5261c..cd82a2feb24f0 100644 --- a/lldb/test/API/commands/expression/fixits/TestFixIts.py +++ b/lldb/test/API/commands/expression/fixits/TestFixIts.py @@ -47,10 +47,11 @@ def test_with_target(self): # The Fix-It changes "ptr.m" to "ptr->m". expr = "struct MyTy { int m; }; MyTy x; MyTy *ptr = &x; int m = ptr.m;" value = frame.EvaluateExpression(expr, top_level_options) - # A successfully parsed top-level expression will yield an error - # that there is 'no value'. If a parsing error would have happened we - # would get a different error kind, so let's check the error kind here. - self.assertEquals(value.GetError().GetCString(), "error: No value") + # A successfully parsed top-level expression will yield an + # unknown error . If a parsing error would have happened we + # would get a different error kind, so let's check the error + # kind here. + self.assertEquals(value.GetError().GetCString(), "unknown error") # Try with two errors: two_error_expression = "my_pointer.second->a" @@ -170,7 +171,7 @@ def test_with_multiple_retries(self): multiple_runs_options.SetRetriesWithFixIts(2) value = frame.EvaluateExpression(two_runs_expr, multiple_runs_options) # This error signals success for top level expressions. - self.assertEquals(value.GetError().GetCString(), "error: No value") + self.assertEquals(value.GetError().GetCString(), "unknown error") # Test that the code above compiles to the right thing. self.expect_expr("test_X(1)", result_type="int", result_value="123")