Skip to content

Commit

Permalink
Don't codegen impossible to satisfy impls
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Mar 14, 2023
1 parent f1b1ed7 commit b36bbb0
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
15 changes: 15 additions & 0 deletions compiler/rustc_monomorphize/src/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,21 @@ fn create_mono_items_for_default_impls<'tcx>(
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 {
return;
};
Expand Down
13 changes: 13 additions & 0 deletions tests/ui/codegen/mono-impossible.rs
Original file line number Diff line number Diff line change
@@ -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> {}

0 comments on commit b36bbb0

Please sign in to comment.