polymorphize: constrain unevaluated const handling
This commit constrains the support added for handling unevaluated consts in polymorphization (introduced in #75260) by: - Skipping associated constants as this causes cycle errors. - Skipping promoted constants when they contain `Self` as this ensures `T` is used in constants of the form `<Self as Foo<T>>`. Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
3f091baba4
commit
20f4e16824
2 changed files with 24 additions and 4 deletions
|
|
@ -269,15 +269,21 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for UsedGenericParametersVisitor<'a, 'tcx> {
|
|||
self.unused_parameters.clear(param.index);
|
||||
false
|
||||
}
|
||||
ty::ConstKind::Unevaluated(_, _, Some(p)) => {
|
||||
ty::ConstKind::Unevaluated(def, _, Some(p))
|
||||
// Avoid considering `T` unused when constants are of the form:
|
||||
// `<Self as Foo<T>>::foo::promoted[p]`
|
||||
if self.def_id == def.did && !self.tcx.generics_of(def.did).has_self =>
|
||||
{
|
||||
// If there is a promoted, don't look at the substs - since it will always contain
|
||||
// the generic parameters, instead, traverse the promoted MIR.
|
||||
let promoted = self.tcx.promoted_mir(self.def_id);
|
||||
let promoted = self.tcx.promoted_mir(def.did);
|
||||
self.visit_body(&promoted[p]);
|
||||
false
|
||||
}
|
||||
ty::ConstKind::Unevaluated(def_id, unevaluated_substs, None) => {
|
||||
self.visit_child_body(def_id.did, unevaluated_substs);
|
||||
ty::ConstKind::Unevaluated(def, unevaluated_substs, None)
|
||||
if self.tcx.def_kind(def.did) == DefKind::AnonConst =>
|
||||
{
|
||||
self.visit_child_body(def.did, unevaluated_substs);
|
||||
false
|
||||
}
|
||||
_ => c.super_visit_with(self),
|
||||
|
|
|
|||
14
src/test/ui/polymorphization/promoted-function-3.rs
Normal file
14
src/test/ui/polymorphization/promoted-function-3.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// run-pass
|
||||
// compile-flags: -Zpolymorphize=on -Zmir-opt-level=3
|
||||
|
||||
fn caller<T, U>() -> &'static usize {
|
||||
callee::<U>()
|
||||
}
|
||||
|
||||
fn callee<T>() -> &'static usize {
|
||||
&std::mem::size_of::<T>()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
assert_eq!(caller::<(), ()>(), &0);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue