Auto merge of #126878 - matthiaskrgr:rollup-oufemqp, r=matthiaskrgr · rust-lang/rust@bcf94de (original) (raw)

`@@ -386,33 +386,8 @@ fn eval_in_interpreter<'tcx, R: InterpretationResult<'tcx>>(

`

386

386

`CompileTimeMachine::new(CanAccessMutGlobal::from(is_static), CheckAlignment::Error),

`

387

387

`);

`

388

388

`let res = ecx.load_mir(cid.instance.def, cid.promoted);

`

389

``

`-

res.and_then(|body| eval_body_using_ecx(&mut ecx, cid, body)).map_err(|error| {

`

390

``

`-

let (error, backtrace) = error.into_parts();

`

391

``

`-

backtrace.print_backtrace();

`

392

``

-

393

``

`-

let (kind, instance) = if ecx.tcx.is_static(cid.instance.def_id()) {

`

394

``

`-

("static", String::new())

`

395

``

`-

} else {

`

396

``

`-

// If the current item has generics, we'd like to enrich the message with the

`

397

``

`-

// instance and its args: to show the actual compile-time values, in addition to

`

398

``

`-

// the expression, leading to the const eval error.

`

399

``

`-

let instance = &cid.instance;

`

400

``

`-

if !instance.args.is_empty() {

`

401

``

`-

let instance = with_no_trimmed_paths!(instance.to_string());

`

402

``

`-

("const_with_path", instance)

`

403

``

`-

} else {

`

404

``

`-

("const", String::new())

`

405

``

`-

}

`

406

``

`-

};

`

407

``

-

408

``

`-

super::report(

`

409

``

`-

*ecx.tcx,

`

410

``

`-

error,

`

411

``

`-

DUMMY_SP,

`

412

``

`-

|| super::get_span_and_frames(ecx.tcx, ecx.stack()),

`

413

``

`-

|span, frames| ConstEvalError { span, error_kind: kind, instance, frame_notes: frames },

`

414

``

`-

)

`

415

``

`-

})

`

``

389

`+

res.and_then(|body| eval_body_using_ecx(&mut ecx, cid, body))

`

``

390

`+

.map_err(|error| report_eval_error(&ecx, cid, error))

`

416

391

`}

`

417

392

``

418

393

`#[inline(always)]

`

`@@ -438,24 +413,61 @@ fn const_validate_mplace<'tcx>(

`

438

413

` ecx.const_validate_operand(&mplace.into(), path, &mut ref_tracking, mode)

`

439

414

`` // Instead of just reporting the InterpError via the usual machinery, we give a more targeted

``

440

415

`// error about the validation failure.

`

441

``

`-

.map_err(|error| report_validation_error(&ecx, error, alloc_id))?;

`

``

416

`+

.map_err(|error| report_validation_error(&ecx, cid, error, alloc_id))?;

`

442

417

` inner = true;

`

443

418

`}

`

444

419

``

445

420

`Ok(())

`

446

421

`}

`

447

422

``

448

``

`-

#[inline(always)]

`

``

423

`+

#[inline(never)]

`

``

424

`+

fn report_eval_error<'tcx>(

`

``

425

`+

ecx: &InterpCx<'tcx, CompileTimeMachine<'tcx>>,

`

``

426

`+

cid: GlobalId<'tcx>,

`

``

427

`+

error: InterpErrorInfo<'tcx>,

`

``

428

`+

) -> ErrorHandled {

`

``

429

`+

let (error, backtrace) = error.into_parts();

`

``

430

`+

backtrace.print_backtrace();

`

``

431

+

``

432

`+

let (kind, instance) = if ecx.tcx.is_static(cid.instance.def_id()) {

`

``

433

`+

("static", String::new())

`

``

434

`+

} else {

`

``

435

`+

// If the current item has generics, we'd like to enrich the message with the

`

``

436

`+

// instance and its args: to show the actual compile-time values, in addition to

`

``

437

`+

// the expression, leading to the const eval error.

`

``

438

`+

let instance = &cid.instance;

`

``

439

`+

if !instance.args.is_empty() {

`

``

440

`+

let instance = with_no_trimmed_paths!(instance.to_string());

`

``

441

`+

("const_with_path", instance)

`

``

442

`+

} else {

`

``

443

`+

("const", String::new())

`

``

444

`+

}

`

``

445

`+

};

`

``

446

+

``

447

`+

super::report(

`

``

448

`+

*ecx.tcx,

`

``

449

`+

error,

`

``

450

`+

DUMMY_SP,

`

``

451

`+

|| super::get_span_and_frames(ecx.tcx, ecx.stack()),

`

``

452

`+

|span, frames| ConstEvalError { span, error_kind: kind, instance, frame_notes: frames },

`

``

453

`+

)

`

``

454

`+

}

`

``

455

+

``

456

`+

#[inline(never)]

`

449

457

`fn report_validation_error<'tcx>(

`

450

458

`ecx: &InterpCx<'tcx, CompileTimeMachine<'tcx>>,

`

``

459

`+

cid: GlobalId<'tcx>,

`

451

460

`error: InterpErrorInfo<'tcx>,

`

452

461

`alloc_id: AllocId,

`

453

462

`) -> ErrorHandled {

`

``

463

`+

if !matches!(error.kind(), InterpError::UndefinedBehavior(_)) {

`

``

464

`+

// Some other error happened during validation, e.g. an unsupported operation.

`

``

465

`+

return report_eval_error(ecx, cid, error);

`

``

466

`+

}

`

``

467

+

454

468

`let (error, backtrace) = error.into_parts();

`

455

469

` backtrace.print_backtrace();

`

456

470

``

457

``

`-

let ub_note = matches!(error, InterpError::UndefinedBehavior(_)).then(|| {});

`

458

``

-

459

471

`let bytes = ecx.print_alloc_bytes_for_diagnostics(alloc_id);

`

460

472

`let (size, align, _) = ecx.get_alloc_info(alloc_id);

`

461

473

`let raw_bytes = errors::RawBytesNote { size: size.bytes(), align: align.bytes(), bytes };

`

`@@ -465,6 +477,6 @@ fn report_validation_error<'tcx>(

`

465

477

` error,

`

466

478

`DUMMY_SP,

`

467

479

` || crate::const_eval::get_span_and_frames(ecx.tcx, ecx.stack()),

`

468

``

`-

move |span, frames| errors::ValidationFailure { span, ub_note, frames, raw_bytes },

`

``

480

`+

move |span, frames| errors::ValidationFailure { span, ub_note: (), frames, raw_bytes },

`

469

481

`)

`

470

482

`}

`