Skip to content

Commit

Permalink
Fix order of normalization and recursion in const folding.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
veluca93 committed Aug 17, 2024
1 parent 426a60a commit 7fd6232
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
8 changes: 4 additions & 4 deletions compiler/rustc_trait_selection/src/traits/query/normalize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -333,14 +333,14 @@ impl<'cx, 'tcx> FallibleTypeFolder<TyCtxt<'tcx>> for QueryNormalizer<'cx, 'tcx>
return Ok(constant);
}

let constant = constant.try_super_fold_with(self)?;
debug!(?constant, ?self.param_env);
Ok(crate::traits::with_replaced_escaping_bound_vars(
let constant = crate::traits::with_replaced_escaping_bound_vars(
self.infcx,
&mut self.universes,
constant,
|constant| constant.normalize(self.infcx.tcx, self.param_env),
))
);
debug!(?constant, ?self.param_env);
constant.try_super_fold_with(self)
}

#[inline]
Expand Down
25 changes: 25 additions & 0 deletions tests/ui/const-generics/const-ty-is-normalized.rs
Original file line number Diff line number Diff line change
@@ -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: () }
}
}

0 comments on commit 7fd6232

Please sign in to comment.