diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -231,6 +231,10 @@ // We have to clear the value string here so ConstResult children will notice // if their values are changed by hand (i.e. with SetValueAsCString). ClearUserVisibleData(eClearUserVisibleDataItemsValue); + // Children have to be re-computed after updating the parent value. + m_flags.m_children_count_valid = false; + m_children.Clear(); + SetSyntheticChildren(lldb::SyntheticChildrenSP()); } void ValueObject::ClearDynamicTypeInformation() { diff --git a/lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py b/lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py --- a/lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py +++ b/lldb/test/API/python_api/value/change_values/TestChangeValueAPI.py @@ -130,6 +130,19 @@ self.assertEquals(actual_value, 98765, "Got the right changed value from ptr->second_val") + # Test updating the children after updating the parent value. + b = frame0.EvaluateExpression("auto $b_0 = b1; $b_0") + self.assertEquals( + b.GetValue(), + frame0.FindVariable("b1").GetValue()) + self.assertEquals(b.GetChildAtIndex(0).GetValue(), "1") + + b.SetValueFromCString(frame0.FindVariable("b2").GetValue()) + self.assertEquals( + b.GetValue(), + frame0.FindVariable("b2").GetValue()) + self.assertEquals(b.GetChildAtIndex(0).GetValue(), "2") + # gcc may set multiple locations for breakpoint breakpoint.SetEnabled(False) diff --git a/lldb/test/API/python_api/value/change_values/main.c b/lldb/test/API/python_api/value/change_values/main.c --- a/lldb/test/API/python_api/value/change_values/main.c +++ b/lldb/test/API/python_api/value/change_values/main.c @@ -8,7 +8,12 @@ uint32_t second_val; uint64_t third_val; }; - + +struct bar +{ + int value; +}; + int main () { int val = 100; @@ -18,6 +23,11 @@ ptr->second_val = 6666; ptr->third_val = 66666666; + struct bar *b1 = (struct bar *) malloc (sizeof (struct bar)); + b1->value = 1; + struct bar *b2 = (struct bar *) malloc (sizeof (struct bar)); + b2->value = 2; + // Stop here and set values printf ("Val - %d Mine - %d, %d, %llu. Ptr - %d, %d, %llu\n", val, mine.first_val, mine.second_val, mine.third_val,