Don't codegen impossible to satisfy impls
This commit is contained in:
parent
f1b1ed7e18
commit
b36bbb0266
@ -1326,6 +1326,21 @@ fn create_mono_items_for_default_impls<'tcx>(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unlike 'lazy' monomorphization that begins by collecting items transitively
|
||||||
|
// called by `main` or other global items, when eagerly monomorphizing impl
|
||||||
|
// items, we never actually check that the predicates of this impl are satisfied
|
||||||
|
// in a empty reveal-all param env (i.e. with no assumptions).
|
||||||
|
//
|
||||||
|
// Even though this impl has no substitutions, because we don't consider higher-
|
||||||
|
// ranked predicates such as `for<'a> &'a mut [u8]: Copy` to be trivially false,
|
||||||
|
// we must now check that the impl has no impossible-to-satisfy predicates.
|
||||||
|
if tcx.subst_and_check_impossible_predicates((
|
||||||
|
item.owner_id.to_def_id(),
|
||||||
|
&InternalSubsts::identity_for_item(tcx, item.owner_id.to_def_id()),
|
||||||
|
)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let Some(trait_ref) = tcx.impl_trait_ref(item.owner_id) else {
|
let Some(trait_ref) = tcx.impl_trait_ref(item.owner_id) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
13
tests/ui/codegen/mono-impossible.rs
Normal file
13
tests/ui/codegen/mono-impossible.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// compile-flags: -Clink-dead-code=on --crate-type=lib
|
||||||
|
// build-pass
|
||||||
|
|
||||||
|
// Make sure that we don't monomorphize the impossible method `<() as Visit>::visit`,
|
||||||
|
// which does not hold under a reveal-all param env.
|
||||||
|
|
||||||
|
pub trait Visit {
|
||||||
|
fn visit() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Array<'a> {}
|
||||||
|
|
||||||
|
impl Visit for () where (): for<'a> Array<'a> {}
|
Loading…
x
Reference in New Issue
Block a user