@@ -330,40 +330,83 @@ Interpreter::Visit(const ArraySubscriptNode *node) {
330330 return lhs_or_err;
331331 lldb::ValueObjectSP base = *lhs_or_err;
332332
333- // Check to see if 'base' has a synthetic value; if so, try using that.
333+ StreamString var_expr_path_strm;
334334 uint64_t child_idx = node->GetIndex ();
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 (
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 (
343358 " array index {0} is not valid for \" ({1}) {2}\" " , child_idx,
344359 base->GetTypeName ().AsCString (" <invalid type>" ),
345- base-> GetName (). AsCString ());
346- return llvm::make_error<DILDiagnosticError>(m_expr, message ,
360+ var_expr_path_strm. GetData ());
361+ return llvm::make_error<DILDiagnosticError>(m_expr, std::move (err_msg) ,
347362 node->GetLocation ());
348363 }
349- if (lldb::ValueObjectSP child_valobj_sp =
350- synthetic->GetChildAtIndex (child_idx))
351- return child_valobj_sp;
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+ }
352402 }
353403
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;
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;
367410 }
368411
369412 int64_t signed_child_idx = node->GetIndex ();
0 commit comments