Rollup merge of #91430 - jyn514:normalize-fallible, r=jackh726
Add tests for `normalize-docs` overflow errors `@b-naber` do you understand why using `try_normalize_erasing_regions` doesn't silence these cycle errors? Rustdoc isn't emitting them, rustc is aborting before returning an error, even though the function has `try_` in the name. cc https://github.com/rust-lang/rust/issues/82692, https://github.com/rust-lang/rust/pull/91255
This commit is contained in:
commit
4ae75cfa2e
@ -1337,25 +1337,15 @@ fn normalize(cx: &mut DocContext<'tcx>, ty: Ty<'_>) -> Option<Ty<'tcx>> {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
use crate::rustc_trait_selection::infer::TyCtxtInferExt;
|
|
||||||
use crate::rustc_trait_selection::traits::query::normalize::AtExt;
|
|
||||||
use rustc_middle::traits::ObligationCause;
|
|
||||||
|
|
||||||
// Try to normalize `<X as Y>::T` to a type
|
// Try to normalize `<X as Y>::T` to a type
|
||||||
let lifted = ty.lift_to_tcx(cx.tcx).unwrap();
|
let lifted = ty.lift_to_tcx(cx.tcx).unwrap();
|
||||||
let normalized = cx.tcx.infer_ctxt().enter(|infcx| {
|
match cx.tcx.try_normalize_erasing_regions(cx.param_env, lifted) {
|
||||||
infcx
|
|
||||||
.at(&ObligationCause::dummy(), cx.param_env)
|
|
||||||
.normalize(lifted)
|
|
||||||
.map(|resolved| infcx.resolve_vars_if_possible(resolved.value))
|
|
||||||
});
|
|
||||||
match normalized {
|
|
||||||
Ok(normalized_value) => {
|
Ok(normalized_value) => {
|
||||||
debug!("normalized {:?} to {:?}", ty, normalized_value);
|
trace!("normalized {:?} to {:?}", ty, normalized_value);
|
||||||
Some(normalized_value)
|
Some(normalized_value)
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
debug!("failed to normalize {:?}: {:?}", ty, err);
|
info!("failed to normalize {:?}: {:?}", ty, err);
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
20
src/test/rustdoc-ui/auxiliary/overflow.rs
Normal file
20
src/test/rustdoc-ui/auxiliary/overflow.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
pub struct B0;
|
||||||
|
pub struct B1;
|
||||||
|
use std::ops::Shl;
|
||||||
|
use std::ops::Sub;
|
||||||
|
pub type Shleft<A, B> = <A as Shl<B>>::Output;
|
||||||
|
pub type Sub1<A> = <A as Sub<B1>>::Output;
|
||||||
|
pub struct UInt<U, B> {
|
||||||
|
pub(crate) msb: U,
|
||||||
|
pub(crate) lsb: B,
|
||||||
|
}
|
||||||
|
impl<U, B, Ur, Br> Shl<UInt<Ur, Br>> for UInt<U, B>
|
||||||
|
where
|
||||||
|
UInt<Ur, Br>: Sub<B1>,
|
||||||
|
UInt<UInt<U, B>, B0>: Shl<Sub1<UInt<Ur, Br>>>,
|
||||||
|
{
|
||||||
|
type Output = Shleft<UInt<UInt<U, B>, B0>, Sub1<UInt<Ur, Br>>>;
|
||||||
|
fn shl(self, rhs: UInt<Ur, Br>) -> Self::Output {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
25
src/test/rustdoc-ui/normalize-cycle.rs
Normal file
25
src/test/rustdoc-ui/normalize-cycle.rs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// check-pass
|
||||||
|
// Regresion test for <https://github.com/rust-lang/rust/issues/79459>.
|
||||||
|
pub trait Query {}
|
||||||
|
|
||||||
|
pub trait AsQuery {
|
||||||
|
type Query;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Query> AsQuery for T {
|
||||||
|
type Query = T;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait SelectDsl<Selection> {
|
||||||
|
type Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, Selection> SelectDsl<Selection> for T
|
||||||
|
where
|
||||||
|
T: AsQuery,
|
||||||
|
T::Query: SelectDsl<Selection>,
|
||||||
|
{
|
||||||
|
type Output = <T::Query as SelectDsl<Selection>>::Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type Select<Source, Selection> = <Source as SelectDsl<Selection>>::Output;
|
3
src/test/rustdoc-ui/normalize-overflow.rs
Normal file
3
src/test/rustdoc-ui/normalize-overflow.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// aux-crate:overflow=overflow.rs
|
||||||
|
// check-pass
|
||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/79506>.
|
Loading…
x
Reference in New Issue
Block a user