rust-lang / rust-lang/rustc_public

BorrwError when calling `MirConst.eval_target_usize()`

Open
#96 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
125
Forks
19
PR merge metrics
No merged PRs in 30d

Description

fn main() -> ExitCode {
  let cli = Cli::parse();
  match run!(cli.rustc_args(), || demo(cli)) {
    Ok(_) | Err(CompilerError::Skipped | CompilerError::Interrupted(_))
      => ExitCode::SUCCESS,
    _ => ExitCode::FAILURE,
  }
}

struct MyT;

impl MirVisitor for MyT {
  fn visit_mir_const(&mut self, constant: &ty::MirConst, location: mir::visit::Location) {
    println!("{:?}", constant.eval_target_usize());
  }
}

fn demo(cli: Cli) -> ControlFlow<()> {
  let mut v = MyT;
  
  v.visit_body(&stable_mir::entry_fn().unwrap().body());

  ControlFlow::Break(())
}

I try to evaluate a const value via the above api. But it fails to borrow the Context.


thread 'rustc' panicked at compiler/rustc_smir/src/rustc_smir/context.rs:238:29:
already mutably borrowed: BorrowError
stack backtrace:
   0: rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::cell::panic_already_mutably_borrowed
   3: <rustc_smir::rustc_smir::context::TablesWrapper as stable_mir::compiler_interface::Context>::def_name
   4: <stable_mir::crate_def::DefId as core::fmt::Debug>::fmt
   5: core::fmt::Formatter::debug_tuple_field1_finish
   6: <stable_mir::ty::ConstDef as core::fmt::Debug>::fmt
   7: core::fmt::builders::DebugStruct::field
   8: core::fmt::Formatter::debug_struct_field3_finish
   9: <&stable_mir::ty::UnevaluatedConst as core::fmt::Debug>::fmt
  10: core::fmt::Formatter::debug_tuple_field1_finish
  11: <stable_mir::ty::ConstantKind as core::fmt::Debug>::fmt
  12: core::fmt::builders::DebugStruct::field
  13: core::fmt::Formatter::debug_struct_field3_finish
  14: <&stable_mir::ty::MirConst as core::fmt::Debug>::fmt
  15: core::fmt::write
  16: alloc::fmt::format::format_inner
  17: <rustc_smir::rustc_smir::context::TablesWrapper as stable_mir::compiler_interface::Context>::eval_target_usize
  18: <stable_mir::ty::MirConst>::eval_target_usize
  19: <stable_mir_analysis::MyT as stable_mir::mir::visit::MirVisitor>::visit_mir_const
             at ./src/main.rs:47:22
  20: stable_mir::mir::visit::MirVisitor::super_const_operand
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:376:9
  21: stable_mir::mir::visit::MirVisitor::visit_const_operand
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:112:9
  22: stable_mir::mir::visit::MirVisitor::super_operand
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:359:17
  23: stable_mir::mir::visit::MirVisitor::visit_operand
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:99:9
  24: stable_mir::mir::visit::MirVisitor::super_rvalue
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:348:17
  25: stable_mir::mir::visit::MirVisitor::visit_rvalue
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:95:9
  26: stable_mir::mir::visit::MirVisitor::super_statement
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:195:17
  27: stable_mir::mir::visit::MirVisitor::visit_statement
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:64:9
  28: stable_mir::mir::visit::MirVisitor::super_basic_block
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:170:13
  29: stable_mir::mir::visit::MirVisitor::visit_basic_block
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:48:9
  30: stable_mir::mir::visit::MirVisitor::super_body
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:146:13
  31: stable_mir::mir::visit::MirVisitor::visit_body
             at /home/zhuyt/.rustup/toolchains/nightly-2025-03-02-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/compiler/stable_mir/src/mir/visit.rs:44:9
  32: stable_mir_analysis::demo
             at ./src/main.rs:54:3

Btw, is there any way to read the initial value of a global const variable?

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with compiler/rustc_smir/src/rustc_smir/context.rs around line 238 and the Context implementation of eval_target_usize. Reproduce the panic with the MirVisitor example, then trace the borrow and Debug formatting calls shown in the stack trace. Done means eval_target_usize no longer panics in this use, with the behavior for reading a global const clarified or covered by a regression test.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.