Auto merge of #111775 - compiler-errors:triple-check, r=Nilstrieb
Add extra debug assertions for equality for Adt/Variant/FieldDef Would've made it easier to both catch and test https://github.com/rust-lang/rust/pull/111494. Maybe not worth it, since it does mean that the compiler is doing extra work when debug-assertions are enabled, but also that's what debug assertions are for :^) This is a revival of #111523 because I think I pushed an empty branch and bors got a bit too excited it closed the PR.
This commit is contained in:
commit
03761a50a3
@ -111,12 +111,30 @@ impl Ord for AdtDefData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// There should be only one AdtDef for each `did`, therefore
|
|
||||||
/// it is fine to implement `PartialEq` only based on `did`.
|
|
||||||
impl PartialEq for AdtDefData {
|
impl PartialEq for AdtDefData {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
self.did == other.did
|
// There should be only one `AdtDefData` for each `def_id`, therefore
|
||||||
|
// it is fine to implement `PartialEq` only based on `def_id`.
|
||||||
|
//
|
||||||
|
// Below, we exhaustively destructure `self` and `other` so that if the
|
||||||
|
// definition of `AdtDefData` changes, a compile-error will be produced,
|
||||||
|
// reminding us to revisit this assumption.
|
||||||
|
|
||||||
|
let Self { did: self_def_id, variants: _, flags: _, repr: _ } = self;
|
||||||
|
let Self { did: other_def_id, variants: _, flags: _, repr: _ } = other;
|
||||||
|
|
||||||
|
let res = self_def_id == other_def_id;
|
||||||
|
|
||||||
|
// Double check that implicit assumption detailed above.
|
||||||
|
if cfg!(debug_assertions) && res {
|
||||||
|
let deep = self.flags == other.flags
|
||||||
|
&& self.repr == other.repr
|
||||||
|
&& self.variants == other.variants;
|
||||||
|
assert!(deep, "AdtDefData for the same def-id has differing data");
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1882,7 +1882,20 @@ impl PartialEq for VariantDef {
|
|||||||
|
|
||||||
let Self { def_id: lhs_def_id, ctor: _, name: _, discr: _, fields: _, flags: _ } = &self;
|
let Self { def_id: lhs_def_id, ctor: _, name: _, discr: _, fields: _, flags: _ } = &self;
|
||||||
let Self { def_id: rhs_def_id, ctor: _, name: _, discr: _, fields: _, flags: _ } = other;
|
let Self { def_id: rhs_def_id, ctor: _, name: _, discr: _, fields: _, flags: _ } = other;
|
||||||
lhs_def_id == rhs_def_id
|
|
||||||
|
let res = lhs_def_id == rhs_def_id;
|
||||||
|
|
||||||
|
// Double check that implicit assumption detailed above.
|
||||||
|
if cfg!(debug_assertions) && res {
|
||||||
|
let deep = self.ctor == other.ctor
|
||||||
|
&& self.name == other.name
|
||||||
|
&& self.discr == other.discr
|
||||||
|
&& self.fields == other.fields
|
||||||
|
&& self.flags == other.flags;
|
||||||
|
assert!(deep, "VariantDef for the same def-id has differing data");
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1937,7 +1950,15 @@ impl PartialEq for FieldDef {
|
|||||||
|
|
||||||
let Self { did: rhs_did, name: _, vis: _ } = other;
|
let Self { did: rhs_did, name: _, vis: _ } = other;
|
||||||
|
|
||||||
lhs_did == rhs_did
|
let res = lhs_did == rhs_did;
|
||||||
|
|
||||||
|
// Double check that implicit assumption detailed above.
|
||||||
|
if cfg!(debug_assertions) && res {
|
||||||
|
let deep = self.name == other.name && self.vis == other.vis;
|
||||||
|
assert!(deep, "FieldDef for the same def-id has differing data");
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user