Fix order of normalization and recursion in const folding.
Fixes #126831. Without this patch, type normalization is not always idempotent, which leads to all sorts of bugs in places that assume that normalizing a normalized type does nothing.
This commit is contained in:
parent
426a60abc2
commit
7fd62320fe
@ -333,14 +333,14 @@ fn try_fold_const(
|
|||||||
return Ok(constant);
|
return Ok(constant);
|
||||||
}
|
}
|
||||||
|
|
||||||
let constant = constant.try_super_fold_with(self)?;
|
let constant = crate::traits::with_replaced_escaping_bound_vars(
|
||||||
debug!(?constant, ?self.param_env);
|
|
||||||
Ok(crate::traits::with_replaced_escaping_bound_vars(
|
|
||||||
self.infcx,
|
self.infcx,
|
||||||
&mut self.universes,
|
&mut self.universes,
|
||||||
constant,
|
constant,
|
||||||
|constant| constant.normalize(self.infcx.tcx, self.param_env),
|
|constant| constant.normalize(self.infcx.tcx, self.param_env),
|
||||||
))
|
);
|
||||||
|
debug!(?constant, ?self.param_env);
|
||||||
|
constant.try_super_fold_with(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
25
tests/ui/const-generics/const-ty-is-normalized.rs
Normal file
25
tests/ui/const-generics/const-ty-is-normalized.rs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
//@ compile-flags: -Cdebuginfo=2 --crate-type=lib
|
||||||
|
//@ build-pass
|
||||||
|
#![feature(adt_const_params)]
|
||||||
|
|
||||||
|
const N_ISLANDS: usize = 4;
|
||||||
|
|
||||||
|
pub type Matrix = [[usize; N_ISLANDS]; N_ISLANDS];
|
||||||
|
|
||||||
|
const EMPTY_MATRIX: Matrix = [[0; N_ISLANDS]; N_ISLANDS];
|
||||||
|
|
||||||
|
const fn to_matrix() -> Matrix {
|
||||||
|
EMPTY_MATRIX
|
||||||
|
}
|
||||||
|
|
||||||
|
const BRIDGE_MATRIX: [[usize; N_ISLANDS]; N_ISLANDS] = to_matrix();
|
||||||
|
|
||||||
|
pub struct Walk<const CURRENT: usize, const REMAINING: Matrix> {
|
||||||
|
_p: (),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Walk<0, BRIDGE_MATRIX> {
|
||||||
|
pub const fn new() -> Self {
|
||||||
|
Self { _p: () }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user