Auto merge of #139577 - davidtwco:sizedness-go-vroom, r=oli-obk
re-use `Sized` fast-path There's an existing fast path for the `type_op_prove_predicate` predicate, checking for trivially `Sized` types, which can be re-used when evaluating obligations within queries. This should improve performance and was found to be beneficial in #137944. r? types
This commit is contained in:
commit
2da29dbe8f
12 changed files with 70 additions and 31 deletions
|
@ -1873,14 +1873,14 @@ impl<'tcx> Ty<'tcx> {
|
|||
|
||||
/// Fast path helper for testing if a type is `Sized`.
|
||||
///
|
||||
/// Returning true means the type is known to be sized. Returning
|
||||
/// `false` means nothing -- could be sized, might not be.
|
||||
/// Returning true means the type is known to implement `Sized`. Returning `false` means
|
||||
/// nothing -- could be sized, might not be.
|
||||
///
|
||||
/// Note that we could never rely on the fact that a type such as `[_]` is
|
||||
/// trivially `!Sized` because we could be in a type environment with a
|
||||
/// bound such as `[_]: Copy`. A function with such a bound obviously never
|
||||
/// can be called, but that doesn't mean it shouldn't typecheck. This is why
|
||||
/// this method doesn't return `Option<bool>`.
|
||||
/// Note that we could never rely on the fact that a type such as `[_]` is trivially `!Sized`
|
||||
/// because we could be in a type environment with a bound such as `[_]: Copy`. A function with
|
||||
/// such a bound obviously never can be called, but that doesn't mean it shouldn't typecheck.
|
||||
/// This is why this method doesn't return `Option<bool>`.
|
||||
#[instrument(skip(tcx), level = "debug")]
|
||||
pub fn is_trivially_sized(self, tcx: TyCtxt<'tcx>) -> bool {
|
||||
match self.kind() {
|
||||
ty::Infer(ty::IntVar(_) | ty::FloatVar(_))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue