Rollup merge of #123375 - fmease:rustdoc-sati-re-hotfix, r=GuillaumeGomez

rustdoc: synthetic auto trait impls: accept unresolved region vars for now

https://github.com/rust-lang/rust/pull/123348#issuecomment-2032494255:

> Right, [in #123340] I've intentionally changed a `vid_map.get(vid).unwrap_or(r)` to a `vid_map[vid]` making rustdoc panic if `rustc::AutoTraitFinder` returns a region inference variable that cannot be resolved because that is really fishy.  I can change it back with a `FIXME: investigate` […]. [O]nce I [fully] understand [the arcane] `rustc::AutoTraitFinder` [I] can fix the underlying issue if there's one.
>
> `rustc::AutoTraitFinder` can also return placeholder regions `RePlaceholder` which doesn't seem right either and which makes rustdoc ICE, too (we have a GitHub issue for that already[, namely #120606]).

Fixes #123370.
Fixes #112242.

r? ``@GuillaumeGomez``
This commit is contained in:
Matthias Krüger 2024-04-02 21:22:04 +02:00 committed by GitHub
commit 8e271d70a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 1 deletions

View File

@ -181,8 +181,14 @@ fn clean_param_env<'tcx>(
}) })
.map(|pred| { .map(|pred| {
tcx.fold_regions(pred, |r, _| match *r { tcx.fold_regions(pred, |r, _| match *r {
ty::ReVar(vid) => vid_to_region[&vid], // FIXME: Don't `unwrap_or`, I think we should panic if we encounter an infer var that
// we can't map to a concrete region. However, `AutoTraitFinder` *does* leak those kinds
// of `ReVar`s for some reason at the time of writing. See `rustdoc-ui/` tests.
// This is in dire need of an investigation into `AutoTraitFinder`.
ty::ReVar(vid) => vid_to_region.get(&vid).copied().unwrap_or(r),
ty::ReEarlyParam(_) | ty::ReStatic | ty::ReBound(..) | ty::ReError(_) => r, ty::ReEarlyParam(_) | ty::ReStatic | ty::ReBound(..) | ty::ReError(_) => r,
// FIXME(#120606): `AutoTraitFinder` can actually leak placeholder regions which feels
// incorrect. Needs investigation.
ty::ReLateParam(_) | ty::RePlaceholder(_) | ty::ReErased => { ty::ReLateParam(_) | ty::RePlaceholder(_) | ty::ReErased => {
bug!("unexpected region kind: {r:?}") bug!("unexpected region kind: {r:?}")
} }

View File

@ -0,0 +1,17 @@
// We used to ICE here while trying to synthesize auto trait impls.
// issue: 112242
//@ check-pass
//@ compile-flags: -Znormalize-docs
pub trait MyTrait<'a> {
type MyItem;
}
pub struct Inner<Q>(Q);
pub struct Outer<Q>(Inner<Q>);
impl<'a, Q> std::marker::Unpin for Inner<Q>
where
Q: MyTrait<'a>,
<Q as MyTrait<'a>>::MyItem: Copy,
{
}

View File

@ -0,0 +1,11 @@
// We used to ICE here while trying to synthesize auto trait impls.
// issue: 123370
//@ check-pass
pub struct Inner<'a, Q>(&'a (), Q);
pub struct Outer<'a, Q>(Inner<'a, Q>);
impl<'a, Q: Trait<'a>> std::marker::Unpin for Inner<'static, Q> {}
pub trait Trait<'a> {}