@@ -48,7 +48,7 @@ pub use subst::*;
4848pub use vtable:: * ;
4949
5050use std:: fmt:: Debug ;
51- use std:: hash:: Hash ;
51+ use std:: hash:: { Hash , Hasher } ;
5252use std:: ops:: ControlFlow ;
5353use std:: { fmt, str} ;
5454
@@ -1704,6 +1704,59 @@ impl VariantDef {
17041704 }
17051705}
17061706
1707+ impl PartialEq for VariantDef {
1708+ #[ inline]
1709+ fn eq ( & self , other : & Self ) -> bool {
1710+ // There should be only one `VariantDef` for each `def_id`, therefore
1711+ // it is fine to implement `PartialEq` only based on `def_id`.
1712+ //
1713+ // Below, we exhaustively destructure `self` and `other` so that if the
1714+ // definition of `VariantDef` changes, a compile-error will be produced,
1715+ // reminding us to revisit this assumption.
1716+
1717+ let Self {
1718+ def_id : lhs_def_id,
1719+ ctor_def_id : _,
1720+ name : _,
1721+ discr : _,
1722+ fields : _,
1723+ ctor_kind : _,
1724+ flags : _,
1725+ } = & self ;
1726+
1727+ let Self {
1728+ def_id : rhs_def_id,
1729+ ctor_def_id : _,
1730+ name : _,
1731+ discr : _,
1732+ fields : _,
1733+ ctor_kind : _,
1734+ flags : _,
1735+ } = other;
1736+
1737+ lhs_def_id == rhs_def_id
1738+ }
1739+ }
1740+
1741+ impl Eq for VariantDef { }
1742+
1743+ impl Hash for VariantDef {
1744+ #[ inline]
1745+ fn hash < H : Hasher > ( & self , s : & mut H ) {
1746+ // There should be only one `VariantDef` for each `def_id`, therefore
1747+ // it is fine to implement `Hash` only based on `def_id`.
1748+ //
1749+ // Below, we exhaustively destructure `self` so that if the definition
1750+ // of `VariantDef` changes, a compile-error will be produced, reminding
1751+ // us to revisit this assumption.
1752+
1753+ let Self { def_id, ctor_def_id : _, name : _, discr : _, fields : _, ctor_kind : _, flags : _ } =
1754+ & self ;
1755+
1756+ def_id. hash ( s)
1757+ }
1758+ }
1759+
17071760#[ derive( Copy , Clone , Debug , PartialEq , Eq , TyEncodable , TyDecodable , HashStable ) ]
17081761pub enum VariantDiscr {
17091762 /// Explicit value for this variant, i.e., `X = 123`.
@@ -1724,6 +1777,42 @@ pub struct FieldDef {
17241777 pub vis : Visibility ,
17251778}
17261779
1780+ impl PartialEq for FieldDef {
1781+ #[ inline]
1782+ fn eq ( & self , other : & Self ) -> bool {
1783+ // There should be only one `FieldDef` for each `did`, therefore it is
1784+ // fine to implement `PartialEq` only based on `did`.
1785+ //
1786+ // Below, we exhaustively destructure `self` so that if the definition
1787+ // of `FieldDef` changes, a compile-error will be produced, reminding
1788+ // us to revisit this assumption.
1789+
1790+ let Self { did : lhs_did, name : _, vis : _ } = & self ;
1791+
1792+ let Self { did : rhs_did, name : _, vis : _ } = other;
1793+
1794+ lhs_did == rhs_did
1795+ }
1796+ }
1797+
1798+ impl Eq for FieldDef { }
1799+
1800+ impl Hash for FieldDef {
1801+ #[ inline]
1802+ fn hash < H : Hasher > ( & self , s : & mut H ) {
1803+ // There should be only one `FieldDef` for each `did`, therefore it is
1804+ // fine to implement `Hash` only based on `did`.
1805+ //
1806+ // Below, we exhaustively destructure `self` so that if the definition
1807+ // of `FieldDef` changes, a compile-error will be produced, reminding
1808+ // us to revisit this assumption.
1809+
1810+ let Self { did, name : _, vis : _ } = & self ;
1811+
1812+ did. hash ( s)
1813+ }
1814+ }
1815+
17271816bitflags ! {
17281817 #[ derive( TyEncodable , TyDecodable , Default , HashStable ) ]
17291818 pub struct ReprFlags : u8 {
0 commit comments