Shrink SelectionError
a lot
`SelectionError` used to be 80 bytes (on 64 bit). That's quite big. Especially because the selection cache contained `Result<_, SelectionError>. The Ok type is only 32 bytes, so the 80 bytes significantly inflate the size of the cache. Most variants of the `SelectionError` seem to be hard errors, only `Unimplemented` shows up in practice (for cranelift-codegen, it occupies 23.4% of all cache entries). We can just box away the biggest variant, `OutputTypeParameterMismatch`, to get the size down to 16 bytes, well within the size of the Ok type inside the cache.
This commit is contained in:
parent
33a01e2e93
commit
41a9cbeb64
5 changed files with 30 additions and 12 deletions
|
@ -580,11 +580,7 @@ pub enum SelectionError<'tcx> {
|
|||
/// After a closure impl has selected, its "outputs" were evaluated
|
||||
/// (which for closures includes the "input" type params) and they
|
||||
/// didn't resolve. See `confirm_poly_trait_refs` for more.
|
||||
OutputTypeParameterMismatch(
|
||||
ty::PolyTraitRef<'tcx>,
|
||||
ty::PolyTraitRef<'tcx>,
|
||||
ty::error::TypeError<'tcx>,
|
||||
),
|
||||
OutputTypeParameterMismatch(Box<SelectionOutputTypeParameterMismatch<'tcx>>),
|
||||
/// The trait pointed by `DefId` is not object safe.
|
||||
TraitNotObjectSafe(DefId),
|
||||
/// A given constant couldn't be evaluated.
|
||||
|
@ -596,6 +592,13 @@ pub enum SelectionError<'tcx> {
|
|||
ErrorReporting,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, TypeVisitable, Lift)]
|
||||
pub struct SelectionOutputTypeParameterMismatch<'tcx> {
|
||||
pub found_trait_ref: ty::PolyTraitRef<'tcx>,
|
||||
pub expected_trait_ref: ty::PolyTraitRef<'tcx>,
|
||||
pub terr: ty::error::TypeError<'tcx>,
|
||||
}
|
||||
|
||||
/// When performing resolution, it is typically the case that there
|
||||
/// can be one of three outcomes:
|
||||
///
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue