|  | 
| 3 | 3 | use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; | 
| 4 | 4 | use rustc_data_structures::unify::{EqUnifyValue, UnifyKey}; | 
| 5 | 5 | use rustc_serialize::{Decodable, Decoder, Encodable}; | 
| 6 |  | -use std::cmp::Ordering; | 
| 7 | 6 | use std::mem::discriminant; | 
| 8 | 7 | use std::{fmt, hash}; | 
| 9 | 8 | 
 | 
| @@ -114,6 +113,13 @@ pub enum AliasKind { | 
| 114 | 113 | /// Types written by the user start out as `hir::TyKind` and get | 
| 115 | 114 | /// converted to this representation using `AstConv::ast_ty_to_ty`. | 
| 116 | 115 | #[rustc_diagnostic_item = "IrTyKind"] | 
|  | 116 | +#[derive(derivative::Derivative)] | 
|  | 117 | +#[derivative( | 
|  | 118 | +    PartialOrd(bound = ""), | 
|  | 119 | +    PartialOrd = "feature_allow_slow_enum", | 
|  | 120 | +    Ord(bound = ""), | 
|  | 121 | +    Ord = "feature_allow_slow_enum" | 
|  | 122 | +)] | 
| 117 | 123 | pub enum TyKind<I: Interner> { | 
| 118 | 124 |     /// The primitive boolean type. Written as `bool`. | 
| 119 | 125 |     Bool, | 
| @@ -410,64 +416,6 @@ impl<I: Interner> PartialEq for TyKind<I> { | 
| 410 | 416 | // This is manually implemented because a derive would require `I: Eq` | 
| 411 | 417 | impl<I: Interner> Eq for TyKind<I> {} | 
| 412 | 418 | 
 | 
| 413 |  | -// This is manually implemented because a derive would require `I: PartialOrd` | 
| 414 |  | -impl<I: Interner> PartialOrd for TyKind<I> { | 
| 415 |  | -    #[inline] | 
| 416 |  | -    fn partial_cmp(&self, other: &TyKind<I>) -> Option<Ordering> { | 
| 417 |  | -        Some(self.cmp(other)) | 
| 418 |  | -    } | 
| 419 |  | -} | 
| 420 |  | - | 
| 421 |  | -// This is manually implemented because a derive would require `I: Ord` | 
| 422 |  | -impl<I: Interner> Ord for TyKind<I> { | 
| 423 |  | -    #[inline] | 
| 424 |  | -    fn cmp(&self, other: &TyKind<I>) -> Ordering { | 
| 425 |  | -        tykind_discriminant(self).cmp(&tykind_discriminant(other)).then_with(|| { | 
| 426 |  | -            match (self, other) { | 
| 427 |  | -                (Int(a_i), Int(b_i)) => a_i.cmp(b_i), | 
| 428 |  | -                (Uint(a_u), Uint(b_u)) => a_u.cmp(b_u), | 
| 429 |  | -                (Float(a_f), Float(b_f)) => a_f.cmp(b_f), | 
| 430 |  | -                (Adt(a_d, a_s), Adt(b_d, b_s)) => a_d.cmp(b_d).then_with(|| a_s.cmp(b_s)), | 
| 431 |  | -                (Foreign(a_d), Foreign(b_d)) => a_d.cmp(b_d), | 
| 432 |  | -                (Array(a_t, a_c), Array(b_t, b_c)) => a_t.cmp(b_t).then_with(|| a_c.cmp(b_c)), | 
| 433 |  | -                (Slice(a_t), Slice(b_t)) => a_t.cmp(b_t), | 
| 434 |  | -                (RawPtr(a_t), RawPtr(b_t)) => a_t.cmp(b_t), | 
| 435 |  | -                (Ref(a_r, a_t, a_m), Ref(b_r, b_t, b_m)) => { | 
| 436 |  | -                    a_r.cmp(b_r).then_with(|| a_t.cmp(b_t).then_with(|| a_m.cmp(b_m))) | 
| 437 |  | -                } | 
| 438 |  | -                (FnDef(a_d, a_s), FnDef(b_d, b_s)) => a_d.cmp(b_d).then_with(|| a_s.cmp(b_s)), | 
| 439 |  | -                (FnPtr(a_s), FnPtr(b_s)) => a_s.cmp(b_s), | 
| 440 |  | -                (Dynamic(a_p, a_r, a_repr), Dynamic(b_p, b_r, b_repr)) => { | 
| 441 |  | -                    a_p.cmp(b_p).then_with(|| a_r.cmp(b_r).then_with(|| a_repr.cmp(b_repr))) | 
| 442 |  | -                } | 
| 443 |  | -                (Closure(a_p, a_s), Closure(b_p, b_s)) => a_p.cmp(b_p).then_with(|| a_s.cmp(b_s)), | 
| 444 |  | -                (Coroutine(a_d, a_s, a_m), Coroutine(b_d, b_s, b_m)) => { | 
| 445 |  | -                    a_d.cmp(b_d).then_with(|| a_s.cmp(b_s).then_with(|| a_m.cmp(b_m))) | 
| 446 |  | -                } | 
| 447 |  | -                ( | 
| 448 |  | -                    CoroutineWitness(a_d, a_s), | 
| 449 |  | -                    CoroutineWitness(b_d, b_s), | 
| 450 |  | -                ) => match Ord::cmp(a_d, b_d) { | 
| 451 |  | -                    Ordering::Equal => Ord::cmp(a_s, b_s), | 
| 452 |  | -                    cmp => cmp, | 
| 453 |  | -                }, | 
| 454 |  | -                (Tuple(a_t), Tuple(b_t)) => a_t.cmp(b_t), | 
| 455 |  | -                (Alias(a_i, a_p), Alias(b_i, b_p)) => a_i.cmp(b_i).then_with(|| a_p.cmp(b_p)), | 
| 456 |  | -                (Param(a_p), Param(b_p)) => a_p.cmp(b_p), | 
| 457 |  | -                (Bound(a_d, a_b), Bound(b_d, b_b)) => a_d.cmp(b_d).then_with(|| a_b.cmp(b_b)), | 
| 458 |  | -                (Placeholder(a_p), Placeholder(b_p)) => a_p.cmp(b_p), | 
| 459 |  | -                (Infer(a_t), Infer(b_t)) => a_t.cmp(b_t), | 
| 460 |  | -                (Error(a_e), Error(b_e)) => a_e.cmp(b_e), | 
| 461 |  | -                (Bool, Bool) | (Char, Char) | (Str, Str) | (Never, Never) => Ordering::Equal, | 
| 462 |  | -                _ => { | 
| 463 |  | -                    debug_assert!(false, "This branch must be unreachable, maybe the match is missing an arm? self = {self:?}, other = {other:?}"); | 
| 464 |  | -                    Ordering::Equal | 
| 465 |  | -                } | 
| 466 |  | -            } | 
| 467 |  | -        }) | 
| 468 |  | -    } | 
| 469 |  | -} | 
| 470 |  | - | 
| 471 | 419 | // This is manually implemented because a derive would require `I: Hash` | 
| 472 | 420 | impl<I: Interner> hash::Hash for TyKind<I> { | 
| 473 | 421 |     fn hash<__H: hash::Hasher>(&self, state: &mut __H) -> () { | 
| @@ -614,6 +562,7 @@ impl<I: Interner> DebugWithInfcx<I> for TyKind<I> { | 
| 614 | 562 |         } | 
| 615 | 563 |     } | 
| 616 | 564 | } | 
|  | 565 | + | 
| 617 | 566 | // This is manually implemented because a derive would require `I: Debug` | 
| 618 | 567 | impl<I: Interner> fmt::Debug for TyKind<I> { | 
| 619 | 568 |     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|  | 
0 commit comments