Rollup merge of #91791 - terrarier2111:fix-float-ice, r=nagisa
Fix an ICE when lowering a float with missing exponent magnitude This fixes: https://github.com/rust-lang/rust/issues/91434
This commit is contained in:
commit
c088e5092b
3 changed files with 42 additions and 9 deletions
|
@ -46,7 +46,9 @@ crate fn lit_to_const<'tcx>(
|
||||||
(ast::LitKind::Int(n, _), ty::Uint(_)) | (ast::LitKind::Int(n, _), ty::Int(_)) => {
|
(ast::LitKind::Int(n, _), ty::Uint(_)) | (ast::LitKind::Int(n, _), ty::Int(_)) => {
|
||||||
trunc(if neg { (*n as i128).overflowing_neg().0 as u128 } else { *n })?
|
trunc(if neg { (*n as i128).overflowing_neg().0 as u128 } else { *n })?
|
||||||
}
|
}
|
||||||
(ast::LitKind::Float(n, _), ty::Float(fty)) => parse_float(*n, *fty, neg),
|
(ast::LitKind::Float(n, _), ty::Float(fty)) => {
|
||||||
|
parse_float(*n, *fty, neg).ok_or(LitToConstError::Reported)?
|
||||||
|
}
|
||||||
(ast::LitKind::Bool(b), ty::Bool) => ConstValue::Scalar(Scalar::from_bool(*b)),
|
(ast::LitKind::Bool(b), ty::Bool) => ConstValue::Scalar(Scalar::from_bool(*b)),
|
||||||
(ast::LitKind::Char(c), ty::Char) => ConstValue::Scalar(Scalar::from_char(*c)),
|
(ast::LitKind::Char(c), ty::Char) => ConstValue::Scalar(Scalar::from_char(*c)),
|
||||||
(ast::LitKind::Err(_), _) => return Err(LitToConstError::Reported),
|
(ast::LitKind::Err(_), _) => return Err(LitToConstError::Reported),
|
||||||
|
@ -55,14 +57,15 @@ crate fn lit_to_const<'tcx>(
|
||||||
Ok(ty::Const::from_value(tcx, lit, ty))
|
Ok(ty::Const::from_value(tcx, lit, ty))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_float<'tcx>(num: Symbol, fty: ty::FloatTy, neg: bool) -> ConstValue<'tcx> {
|
fn parse_float<'tcx>(num: Symbol, fty: ty::FloatTy, neg: bool) -> Option<ConstValue<'tcx>> {
|
||||||
let num = num.as_str();
|
let num = num.as_str();
|
||||||
use rustc_apfloat::ieee::{Double, Single};
|
use rustc_apfloat::ieee::{Double, Single};
|
||||||
let scalar = match fty {
|
let scalar = match fty {
|
||||||
ty::FloatTy::F32 => {
|
ty::FloatTy::F32 => {
|
||||||
let rust_f = num
|
let rust_f = match num.parse::<f32>() {
|
||||||
.parse::<f32>()
|
Ok(f) => f,
|
||||||
.unwrap_or_else(|e| panic!("f32 failed to parse `{}`: {:?}", num, e));
|
Err(_) => return None,
|
||||||
|
};
|
||||||
let mut f = num.parse::<Single>().unwrap_or_else(|e| {
|
let mut f = num.parse::<Single>().unwrap_or_else(|e| {
|
||||||
panic!("apfloat::ieee::Single failed to parse `{}`: {:?}", num, e)
|
panic!("apfloat::ieee::Single failed to parse `{}`: {:?}", num, e)
|
||||||
});
|
});
|
||||||
|
@ -82,9 +85,10 @@ fn parse_float<'tcx>(num: Symbol, fty: ty::FloatTy, neg: bool) -> ConstValue<'tc
|
||||||
Scalar::from_f32(f)
|
Scalar::from_f32(f)
|
||||||
}
|
}
|
||||||
ty::FloatTy::F64 => {
|
ty::FloatTy::F64 => {
|
||||||
let rust_f = num
|
let rust_f = match num.parse::<f64>() {
|
||||||
.parse::<f64>()
|
Ok(f) => f,
|
||||||
.unwrap_or_else(|e| panic!("f64 failed to parse `{}`: {:?}", num, e));
|
Err(_) => return None,
|
||||||
|
};
|
||||||
let mut f = num.parse::<Double>().unwrap_or_else(|e| {
|
let mut f = num.parse::<Double>().unwrap_or_else(|e| {
|
||||||
panic!("apfloat::ieee::Double failed to parse `{}`: {:?}", num, e)
|
panic!("apfloat::ieee::Double failed to parse `{}`: {:?}", num, e)
|
||||||
});
|
});
|
||||||
|
@ -105,5 +109,5 @@ fn parse_float<'tcx>(num: Symbol, fty: ty::FloatTy, neg: bool) -> ConstValue<'tc
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ConstValue::Scalar(scalar)
|
Some(ConstValue::Scalar(scalar))
|
||||||
}
|
}
|
||||||
|
|
6
src/test/ui/consts/issue-91434.rs
Normal file
6
src/test/ui/consts/issue-91434.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
fn main() {
|
||||||
|
[9; [[9E; h]]];
|
||||||
|
//~^ ERROR: expected at least one digit in exponent
|
||||||
|
//~| ERROR: cannot find value `h` in this scope [E0425]
|
||||||
|
//~| ERROR: constant expression depends on a generic parameter
|
||||||
|
}
|
23
src/test/ui/consts/issue-91434.stderr
Normal file
23
src/test/ui/consts/issue-91434.stderr
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
error: expected at least one digit in exponent
|
||||||
|
--> $DIR/issue-91434.rs:2:11
|
||||||
|
|
|
||||||
|
LL | [9; [[9E; h]]];
|
||||||
|
| ^^
|
||||||
|
|
||||||
|
error[E0425]: cannot find value `h` in this scope
|
||||||
|
--> $DIR/issue-91434.rs:2:15
|
||||||
|
|
|
||||||
|
LL | [9; [[9E; h]]];
|
||||||
|
| ^ not found in this scope
|
||||||
|
|
||||||
|
error: constant expression depends on a generic parameter
|
||||||
|
--> $DIR/issue-91434.rs:2:9
|
||||||
|
|
|
||||||
|
LL | [9; [[9E; h]]];
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: this may fail depending on what value the parameter takes
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0425`.
|
Loading…
Add table
Add a link
Reference in a new issue