@@ -330,83 +330,40 @@ Interpreter::Visit(const ArraySubscriptNode *node) {
330330 return lhs_or_err;
331331 lldb::ValueObjectSP base = *lhs_or_err;
332332
333- StreamString var_expr_path_strm;
333+ // Check to see if 'base' has a synthetic value; if so, try using that.
334334 uint64_t child_idx = node->GetIndex ();
335- lldb::ValueObjectSP child_valobj_sp;
336- bool is_incomplete_array = false ;
337- CompilerType base_type = base->GetCompilerType ().GetNonReferenceType ();
338- base->GetExpressionPath (var_expr_path_strm);
339- if (base_type.IsPointerType ()) {
340- child_valobj_sp = base->GetSyntheticArrayMember (child_idx, true );
341- if (!child_valobj_sp) {
342- std::string err_msg = llvm::formatv (
343- " failed to use pointer as array for index {0} for "
344- " \" ({1}) {2}\" " ,
345- child_idx, base->GetTypeName ().AsCString (" <invalid type>" ),
346- var_expr_path_strm.GetData ());
347- if (base_type.IsPointerToVoid ())
348- err_msg = " subscript of pointer to incomplete type 'void'" ;
349- return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg),
350- node->GetLocation ());
351- }
352- } else if (base_type.IsArrayType (nullptr , nullptr , &is_incomplete_array)) {
353- child_valobj_sp = base->GetChildAtIndex (child_idx);
354- if (!child_valobj_sp && (is_incomplete_array || m_use_synthetic))
355- child_valobj_sp = base->GetSyntheticArrayMember (child_idx, true );
356- if (!child_valobj_sp) {
357- std::string err_msg = llvm::formatv (
335+ if (lldb::ValueObjectSP synthetic = base->GetSyntheticValue ()) {
336+ llvm::Expected<uint32_t > num_children =
337+ synthetic->GetNumChildren (child_idx + 1 );
338+ if (!num_children)
339+ return llvm::make_error<DILDiagnosticError>(
340+ m_expr, toString (num_children.takeError ()), node->GetLocation ());
341+ if (child_idx >= *num_children) {
342+ std::string message = llvm::formatv (
358343 " array index {0} is not valid for \" ({1}) {2}\" " , child_idx,
359344 base->GetTypeName ().AsCString (" <invalid type>" ),
360- var_expr_path_strm. GetData ());
361- return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg) ,
345+ base-> GetName (). AsCString ());
346+ return llvm::make_error<DILDiagnosticError>(m_expr, message ,
362347 node->GetLocation ());
363348 }
364- } else if (base_type.IsScalarType ()) {
365- child_valobj_sp =
366- base->GetSyntheticBitFieldChild (child_idx, child_idx, true );
367- if (!child_valobj_sp) {
368- std::string err_msg = llvm::formatv (
369- " bitfield range {0}-{1} is not valid for \" ({2}) {3}\" " , child_idx,
370- child_idx, base->GetTypeName ().AsCString (" <invalid type>" ),
371- var_expr_path_strm.GetData ());
372- return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg),
373- node->GetLocation (), 1 );
374- }
375- } else {
376- lldb::ValueObjectSP synthetic = base->GetSyntheticValue ();
377- if (!m_use_synthetic || !synthetic || synthetic == base) {
378- std::string err_msg =
379- llvm::formatv (" \" {0}\" is not an array type" ,
380- base->GetTypeName ().AsCString (" <invalid type>" ));
381- return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg),
382- node->GetLocation (), 1 );
383- }
384- if (static_cast <uint32_t >(child_idx) >=
385- synthetic->GetNumChildrenIgnoringErrors (child_idx + 1 )) {
386- std::string err_msg = llvm::formatv (
387- " array index {0} is not valid for \" ({1}) {2}\" " , child_idx,
388- base->GetTypeName ().AsCString (" <invalid type>" ),
389- var_expr_path_strm.GetData ());
390- return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg),
391- node->GetLocation (), 1 );
392- }
393- child_valobj_sp = synthetic->GetChildAtIndex (child_idx);
394- if (!child_valobj_sp) {
395- std::string err_msg = llvm::formatv (
396- " array index {0} is not valid for \" ({1}) {2}\" " , child_idx,
397- base->GetTypeName ().AsCString (" <invalid type>" ),
398- var_expr_path_strm.GetData ());
399- return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg),
400- node->GetLocation (), 1 );
401- }
349+ if (lldb::ValueObjectSP child_valobj_sp =
350+ synthetic->GetChildAtIndex (child_idx))
351+ return child_valobj_sp;
402352 }
403353
404- if (child_valobj_sp) {
405- if (m_use_dynamic != lldb::eNoDynamicValues) {
406- if (auto dynamic_sp = child_valobj_sp->GetDynamicValue (m_use_dynamic))
407- child_valobj_sp = std::move (dynamic_sp);
408- }
409- return child_valobj_sp;
354+ auto base_type = base->GetCompilerType ().GetNonReferenceType ();
355+ if (!base_type.IsPointerType () && !base_type.IsArrayType ())
356+ return llvm::make_error<DILDiagnosticError>(
357+ m_expr, " subscripted value is not an array or pointer" ,
358+ node->GetLocation ());
359+ if (base_type.IsPointerToVoid ())
360+ return llvm::make_error<DILDiagnosticError>(
361+ m_expr, " subscript of pointer to incomplete type 'void'" ,
362+ node->GetLocation ());
363+
364+ if (base_type.IsArrayType ()) {
365+ if (lldb::ValueObjectSP child_valobj_sp = base->GetChildAtIndex (child_idx))
366+ return child_valobj_sp;
410367 }
411368
412369 int64_t signed_child_idx = node->GetIndex ();
0 commit comments