@@ -330,83 +330,40 @@ Interpreter::Visit(const ArraySubscriptNode *node) {
330
330
return lhs_or_err;
331
331
lldb::ValueObjectSP base = *lhs_or_err;
332
332
333
- StreamString var_expr_path_strm;
333
+ // Check to see if 'base' has a synthetic value; if so, try using that.
334
334
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 (
358
343
" array index {0} is not valid for \" ({1}) {2}\" " , child_idx,
359
344
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 ,
362
347
node->GetLocation ());
363
348
}
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;
402
352
}
403
353
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;
410
367
}
411
368
412
369
int64_t signed_child_idx = node->GetIndex ();
0 commit comments