Walk the left side of where bounds if the bounded type is not a generic parameter

This commit is contained in:
Michael Krasnitski 2023-09-11 21:43:27 -04:00
parent 98363cbf6a
commit f598bb75d4
3 changed files with 36 additions and 1 deletions

View File

@ -246,8 +246,13 @@ impl<'cx, 'tcx> Visitor<'tcx> for TypeWalker<'cx, 'tcx> {
{
self.ty_params.remove(&def_id);
}
} else {
// If the bounded type isn't a generic param, but is instead a concrete generic
// type, any params we find nested inside of it are being used as concrete types,
// and can therefore can be considered used. So, we're fine to walk the left-hand
// side of the where bound.
walk_ty(self, predicate.bounded_ty);
}
// Only walk the right-hand side of where bounds
for bound in predicate.bounds {
walk_param_bound(self, bound);
}

View File

@ -113,4 +113,19 @@ with_span!(
}
);
mod issue11302 {
use std::fmt::Debug;
use std::marker::PhantomData;
#[derive(Debug)]
struct Wrapper<T>(PhantomData<T>);
fn store<T: 'static>(v: &mut Vec<Box<dyn Debug>>)
where
Wrapper<T>: Debug,
{
v.push(Box::new(Wrapper(PhantomData)));
}
}
fn main() {}

View File

@ -113,4 +113,19 @@ with_span!(
}
);
mod issue11302 {
use std::fmt::Debug;
use std::marker::PhantomData;
#[derive(Debug)]
struct Wrapper<T>(PhantomData<T>);
fn store<T: 'static>(v: &mut Vec<Box<dyn Debug>>)
where
Wrapper<T>: Debug,
{
v.push(Box::new(Wrapper(PhantomData)));
}
}
fn main() {}