mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Rollup merge of #130715 - compiler-errors:mir-build-const-eval, r=BoxyUwU
Replace calls to `ty::Const::{try_}eval` in mir build/pattern analysis We normalize consts in writeback: #130645. This means that consts are gonna be as normalized as they're ever gonna get in MIR building and pattern analysis. Therefore we can just use `try_to_target_usize` rather than calling `eval_target_usize`. Regarding the `.expect` calls, I'm not totally certain whether they're correct given rigid unevaluated consts. But this PR shouldn't make *more* ICEs occur; we may have to squash these ICEs when mGCE comes around, tho 😺
This commit is contained in:
commit
0e08d7002b
@ -57,7 +57,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
this.in_scope(region_scope, lint_level, |this| this.as_rvalue(block, scope, value))
|
this.in_scope(region_scope, lint_level, |this| this.as_rvalue(block, scope, value))
|
||||||
}
|
}
|
||||||
ExprKind::Repeat { value, count } => {
|
ExprKind::Repeat { value, count } => {
|
||||||
if Some(0) == count.try_eval_target_usize(this.tcx, this.param_env) {
|
if Some(0) == count.try_to_target_usize(this.tcx) {
|
||||||
this.build_zero_repeat(block, value, scope, source_info)
|
this.build_zero_repeat(block, value, scope, source_info)
|
||||||
} else {
|
} else {
|
||||||
let value_operand = unpack!(
|
let value_operand = unpack!(
|
||||||
|
@ -42,7 +42,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
let (min_length, exact_size) = if let Some(place_resolved) = place.try_to_place(self) {
|
let (min_length, exact_size) = if let Some(place_resolved) = place.try_to_place(self) {
|
||||||
match place_resolved.ty(&self.local_decls, tcx).ty.kind() {
|
match place_resolved.ty(&self.local_decls, tcx).ty.kind() {
|
||||||
ty::Array(_, length) => (length.eval_target_usize(tcx, self.param_env), true),
|
ty::Array(_, length) => (
|
||||||
|
length
|
||||||
|
.try_to_target_usize(tcx)
|
||||||
|
.expect("expected len of array pat to be definite"),
|
||||||
|
true,
|
||||||
|
),
|
||||||
_ => ((prefix.len() + suffix.len()).try_into().unwrap(), false),
|
_ => ((prefix.len() + suffix.len()).try_into().unwrap(), false),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -441,7 +441,9 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
|
|||||||
ty::Slice(..) => PatKind::Slice { prefix, slice, suffix },
|
ty::Slice(..) => PatKind::Slice { prefix, slice, suffix },
|
||||||
// Fixed-length array, `[T; len]`.
|
// Fixed-length array, `[T; len]`.
|
||||||
ty::Array(_, len) => {
|
ty::Array(_, len) => {
|
||||||
let len = len.eval_target_usize(self.tcx, self.param_env);
|
let len = len
|
||||||
|
.try_to_target_usize(self.tcx)
|
||||||
|
.expect("expected len of array pat to be definite");
|
||||||
assert!(len >= prefix.len() as u64 + suffix.len() as u64);
|
assert!(len >= prefix.len() as u64 + suffix.len() as u64);
|
||||||
PatKind::Array { prefix, slice, suffix }
|
PatKind::Array { prefix, slice, suffix }
|
||||||
}
|
}
|
||||||
|
@ -352,7 +352,7 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
|
|||||||
ty::Array(sub_ty, len) => {
|
ty::Array(sub_ty, len) => {
|
||||||
// We treat arrays of a constant but unknown length like slices.
|
// We treat arrays of a constant but unknown length like slices.
|
||||||
ConstructorSet::Slice {
|
ConstructorSet::Slice {
|
||||||
array_len: len.try_eval_target_usize(cx.tcx, cx.param_env).map(|l| l as usize),
|
array_len: len.try_to_target_usize(cx.tcx).map(|l| l as usize),
|
||||||
subtype_is_empty: cx.is_uninhabited(*sub_ty),
|
subtype_is_empty: cx.is_uninhabited(*sub_ty),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -685,9 +685,12 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
|
|||||||
}
|
}
|
||||||
PatKind::Array { prefix, slice, suffix } | PatKind::Slice { prefix, slice, suffix } => {
|
PatKind::Array { prefix, slice, suffix } | PatKind::Slice { prefix, slice, suffix } => {
|
||||||
let array_len = match ty.kind() {
|
let array_len = match ty.kind() {
|
||||||
ty::Array(_, length) => {
|
ty::Array(_, length) => Some(
|
||||||
Some(length.eval_target_usize(cx.tcx, cx.param_env) as usize)
|
length
|
||||||
}
|
.try_to_target_usize(cx.tcx)
|
||||||
|
.expect("expected len of array pat to be definite")
|
||||||
|
as usize,
|
||||||
|
),
|
||||||
ty::Slice(_) => None,
|
ty::Slice(_) => None,
|
||||||
_ => span_bug!(pat.span, "bad ty {} for slice pattern", ty.inner()),
|
_ => span_bug!(pat.span, "bad ty {} for slice pattern", ty.inner()),
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user