rust-lang / rust-lang/rustc_public
BorrwError when calling `MirConst.eval_target_usize()`
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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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