Rollup merge of #122691 - veera-sivarajan:bugfix-121099, r=Amanieu
Fix ICE: `global_asm!()` Don't Panic When Unable to Evaluate Constant Fixes #121099 A bit of an inelegant fix but given that the error is created only after call to `const_eval_poly()` and that the calling function cannot propagate the error anywhere else, the error has to be explicitly handled inside `mono_item.rs`. r? `@Amanieu`
This commit is contained in:
commit
2ad2492b7b
3 changed files with 55 additions and 17 deletions
|
@ -2,6 +2,7 @@ use crate::base;
|
||||||
use crate::common;
|
use crate::common;
|
||||||
use crate::traits::*;
|
use crate::traits::*;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
use rustc_middle::mir::interpret::ErrorHandled;
|
||||||
use rustc_middle::mir::mono::MonoItem;
|
use rustc_middle::mir::mono::MonoItem;
|
||||||
use rustc_middle::mir::mono::{Linkage, Visibility};
|
use rustc_middle::mir::mono::{Linkage, Visibility};
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
|
@ -40,23 +41,34 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(op, op_sp)| match *op {
|
.map(|(op, op_sp)| match *op {
|
||||||
hir::InlineAsmOperand::Const { ref anon_const } => {
|
hir::InlineAsmOperand::Const { ref anon_const } => {
|
||||||
let const_value = cx
|
match cx.tcx().const_eval_poly(anon_const.def_id.to_def_id()) {
|
||||||
.tcx()
|
Ok(const_value) => {
|
||||||
.const_eval_poly(anon_const.def_id.to_def_id())
|
let ty = cx
|
||||||
.unwrap_or_else(|_| {
|
.tcx()
|
||||||
span_bug!(*op_sp, "asm const cannot be resolved")
|
.typeck_body(anon_const.body)
|
||||||
});
|
.node_type(anon_const.hir_id);
|
||||||
let ty = cx
|
let string = common::asm_const_to_str(
|
||||||
.tcx()
|
cx.tcx(),
|
||||||
.typeck_body(anon_const.body)
|
*op_sp,
|
||||||
.node_type(anon_const.hir_id);
|
const_value,
|
||||||
let string = common::asm_const_to_str(
|
cx.layout_of(ty),
|
||||||
cx.tcx(),
|
);
|
||||||
*op_sp,
|
GlobalAsmOperandRef::Const { string }
|
||||||
const_value,
|
}
|
||||||
cx.layout_of(ty),
|
Err(ErrorHandled::Reported { .. }) => {
|
||||||
);
|
// An error has already been reported and
|
||||||
GlobalAsmOperandRef::Const { string }
|
// compilation is guaranteed to fail if execution
|
||||||
|
// hits this path. So an empty string instead of
|
||||||
|
// a stringified constant value will suffice.
|
||||||
|
GlobalAsmOperandRef::Const { string: String::new() }
|
||||||
|
}
|
||||||
|
Err(ErrorHandled::TooGeneric(_)) => {
|
||||||
|
span_bug!(
|
||||||
|
*op_sp,
|
||||||
|
"asm const cannot be resolved; too generic"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
hir::InlineAsmOperand::SymFn { ref anon_const } => {
|
hir::InlineAsmOperand::SymFn { ref anon_const } => {
|
||||||
let ty = cx
|
let ty = cx
|
||||||
|
|
11
tests/ui/asm/fail-const-eval-issue-121099.rs
Normal file
11
tests/ui/asm/fail-const-eval-issue-121099.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
//@ build-fail
|
||||||
|
//@ needs-asm-support
|
||||||
|
#![feature(asm_const)]
|
||||||
|
|
||||||
|
use std::arch::global_asm;
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
|
||||||
|
global_asm!("/* {} */", const 1 << 500); //~ ERROR evaluation of constant value failed [E0080]
|
||||||
|
|
||||||
|
global_asm!("/* {} */", const 1 / 0); //~ ERROR evaluation of constant value failed [E0080]
|
15
tests/ui/asm/fail-const-eval-issue-121099.stderr
Normal file
15
tests/ui/asm/fail-const-eval-issue-121099.stderr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
error[E0080]: evaluation of constant value failed
|
||||||
|
--> $DIR/fail-const-eval-issue-121099.rs:9:31
|
||||||
|
|
|
||||||
|
LL | global_asm!("/* {} */", const 1 << 500);
|
||||||
|
| ^^^^^^^^ attempt to shift left by `500_i32`, which would overflow
|
||||||
|
|
||||||
|
error[E0080]: evaluation of constant value failed
|
||||||
|
--> $DIR/fail-const-eval-issue-121099.rs:11:31
|
||||||
|
|
|
||||||
|
LL | global_asm!("/* {} */", const 1 / 0);
|
||||||
|
| ^^^^^ attempt to divide `1_i32` by zero
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
Loading…
Add table
Add a link
Reference in a new issue