Rollup merge of #120516 - Nadrieril:cleanup-impls, r=compiler-errors
pattern_analysis: cleanup manual impls https://github.com/rust-lang/rust/pull/120420 introduced some unneeded manual impls. I remove them here. r? ```@Nilstrieb```
This commit is contained in:
commit
f3ebf1e50f
@ -151,7 +151,6 @@
|
|||||||
use std::cmp::{self, max, min, Ordering};
|
use std::cmp::{self, max, min, Ordering};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::iter::once;
|
use std::iter::once;
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
@ -648,6 +647,7 @@ pub fn new() -> Self {
|
|||||||
/// `specialize_constructor` returns the list of fields corresponding to a pattern, given a
|
/// `specialize_constructor` returns the list of fields corresponding to a pattern, given a
|
||||||
/// constructor. `Constructor::apply` reconstructs the pattern from a pair of `Constructor` and
|
/// constructor. `Constructor::apply` reconstructs the pattern from a pair of `Constructor` and
|
||||||
/// `Fields`.
|
/// `Fields`.
|
||||||
|
#[derive(Debug)]
|
||||||
pub enum Constructor<Cx: TypeCx> {
|
pub enum Constructor<Cx: TypeCx> {
|
||||||
/// Tuples and structs.
|
/// Tuples and structs.
|
||||||
Struct,
|
Struct,
|
||||||
@ -717,74 +717,6 @@ fn clone(&self) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Cx: TypeCx> fmt::Debug for Constructor<Cx> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
Constructor::Struct => f.debug_tuple("Struct").finish(),
|
|
||||||
Constructor::Variant(idx) => f.debug_tuple("Variant").field(idx).finish(),
|
|
||||||
Constructor::Ref => f.debug_tuple("Ref").finish(),
|
|
||||||
Constructor::Slice(slice) => f.debug_tuple("Slice").field(slice).finish(),
|
|
||||||
Constructor::UnionField => f.debug_tuple("UnionField").finish(),
|
|
||||||
Constructor::Bool(b) => f.debug_tuple("Bool").field(b).finish(),
|
|
||||||
Constructor::IntRange(range) => f.debug_tuple("IntRange").field(range).finish(),
|
|
||||||
Constructor::F32Range(lo, hi, end) => {
|
|
||||||
f.debug_tuple("F32Range").field(lo).field(hi).field(end).finish()
|
|
||||||
}
|
|
||||||
Constructor::F64Range(lo, hi, end) => {
|
|
||||||
f.debug_tuple("F64Range").field(lo).field(hi).field(end).finish()
|
|
||||||
}
|
|
||||||
Constructor::Str(value) => f.debug_tuple("Str").field(value).finish(),
|
|
||||||
Constructor::Opaque(inner) => f.debug_tuple("Opaque").field(inner).finish(),
|
|
||||||
Constructor::Or => f.debug_tuple("Or").finish(),
|
|
||||||
Constructor::Wildcard => f.debug_tuple("Wildcard").finish(),
|
|
||||||
Constructor::NonExhaustive => f.debug_tuple("NonExhaustive").finish(),
|
|
||||||
Constructor::Hidden => f.debug_tuple("Hidden").finish(),
|
|
||||||
Constructor::Missing => f.debug_tuple("Missing").finish(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Cx: TypeCx> PartialEq for Constructor<Cx> {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
(mem::discriminant(self) == mem::discriminant(other))
|
|
||||||
&& match (self, other) {
|
|
||||||
(Constructor::Struct, Constructor::Struct) => true,
|
|
||||||
(Constructor::Variant(self_variant), Constructor::Variant(other_variant)) => {
|
|
||||||
self_variant == other_variant
|
|
||||||
}
|
|
||||||
(Constructor::Ref, Constructor::Ref) => true,
|
|
||||||
(Constructor::Slice(self_slice), Constructor::Slice(other_slice)) => {
|
|
||||||
self_slice == other_slice
|
|
||||||
}
|
|
||||||
(Constructor::UnionField, Constructor::UnionField) => true,
|
|
||||||
(Constructor::Bool(self_b), Constructor::Bool(other_b)) => self_b == other_b,
|
|
||||||
(Constructor::IntRange(self_range), Constructor::IntRange(other_range)) => {
|
|
||||||
self_range == other_range
|
|
||||||
}
|
|
||||||
(
|
|
||||||
Constructor::F32Range(self_lo, self_hi, self_end),
|
|
||||||
Constructor::F32Range(other_lo, other_hi, other_end),
|
|
||||||
) => self_lo == other_lo && self_hi == other_hi && self_end == other_end,
|
|
||||||
(
|
|
||||||
Constructor::F64Range(self_lo, self_hi, self_end),
|
|
||||||
Constructor::F64Range(other_lo, other_hi, other_end),
|
|
||||||
) => self_lo == other_lo && self_hi == other_hi && self_end == other_end,
|
|
||||||
(Constructor::Str(self_value), Constructor::Str(other_value)) => {
|
|
||||||
self_value == other_value
|
|
||||||
}
|
|
||||||
(Constructor::Opaque(self_inner), Constructor::Opaque(other_inner)) => {
|
|
||||||
self_inner == other_inner
|
|
||||||
}
|
|
||||||
(Constructor::Or, Constructor::Or) => true,
|
|
||||||
(Constructor::Wildcard, Constructor::Wildcard) => true,
|
|
||||||
(Constructor::NonExhaustive, Constructor::NonExhaustive) => true,
|
|
||||||
(Constructor::Hidden, Constructor::Hidden) => true,
|
|
||||||
(Constructor::Missing, Constructor::Missing) => true,
|
|
||||||
_ => unreachable!(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Cx: TypeCx> Constructor<Cx> {
|
impl<Cx: TypeCx> Constructor<Cx> {
|
||||||
pub(crate) fn is_non_exhaustive(&self) -> bool {
|
pub(crate) fn is_non_exhaustive(&self) -> bool {
|
||||||
matches!(self, NonExhaustive)
|
matches!(self, NonExhaustive)
|
||||||
|
@ -297,6 +297,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
|
|
||||||
/// Same idea as `DeconstructedPat`, except this is a fictitious pattern built up for diagnostics
|
/// Same idea as `DeconstructedPat`, except this is a fictitious pattern built up for diagnostics
|
||||||
/// purposes. As such they don't use interning and can be cloned.
|
/// purposes. As such they don't use interning and can be cloned.
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct WitnessPat<Cx: TypeCx> {
|
pub struct WitnessPat<Cx: TypeCx> {
|
||||||
ctor: Constructor<Cx>,
|
ctor: Constructor<Cx>,
|
||||||
pub(crate) fields: Vec<WitnessPat<Cx>>,
|
pub(crate) fields: Vec<WitnessPat<Cx>>,
|
||||||
@ -309,16 +310,6 @@ fn clone(&self) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Cx: TypeCx> fmt::Debug for WitnessPat<Cx> {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
fmt.debug_struct("WitnessPat")
|
|
||||||
.field("ctor", &self.ctor)
|
|
||||||
.field("fields", &self.fields)
|
|
||||||
.field("ty", &self.ty)
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Cx: TypeCx> WitnessPat<Cx> {
|
impl<Cx: TypeCx> WitnessPat<Cx> {
|
||||||
pub(crate) fn new(ctor: Constructor<Cx>, fields: Vec<Self>, ty: Cx::Ty) -> Self {
|
pub(crate) fn new(ctor: Constructor<Cx>, fields: Vec<Self>, ty: Cx::Ty) -> Self {
|
||||||
Self { ctor, fields, ty }
|
Self { ctor, fields, ty }
|
||||||
|
@ -1207,6 +1207,7 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
/// The final `Pair(Some(_), true)` is then the resulting witness.
|
/// The final `Pair(Some(_), true)` is then the resulting witness.
|
||||||
///
|
///
|
||||||
/// See the top of the file for more detailed explanations and examples.
|
/// See the top of the file for more detailed explanations and examples.
|
||||||
|
#[derive(Debug)]
|
||||||
struct WitnessStack<Cx: TypeCx>(Vec<WitnessPat<Cx>>);
|
struct WitnessStack<Cx: TypeCx>(Vec<WitnessPat<Cx>>);
|
||||||
|
|
||||||
impl<Cx: TypeCx> Clone for WitnessStack<Cx> {
|
impl<Cx: TypeCx> Clone for WitnessStack<Cx> {
|
||||||
@ -1215,12 +1216,6 @@ fn clone(&self) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Cx: TypeCx> fmt::Debug for WitnessStack<Cx> {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
fmt.debug_tuple("WitnessStack").field(&self.0).finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Cx: TypeCx> WitnessStack<Cx> {
|
impl<Cx: TypeCx> WitnessStack<Cx> {
|
||||||
/// Asserts that the witness contains a single pattern, and returns it.
|
/// Asserts that the witness contains a single pattern, and returns it.
|
||||||
fn single_pattern(self) -> WitnessPat<Cx> {
|
fn single_pattern(self) -> WitnessPat<Cx> {
|
||||||
@ -1265,6 +1260,7 @@ fn apply_constructor(&mut self, pcx: &PlaceCtxt<'_, Cx>, ctor: &Constructor<Cx>)
|
|||||||
///
|
///
|
||||||
/// Just as the `Matrix` starts with a single column, by the end of the algorithm, this has a single
|
/// Just as the `Matrix` starts with a single column, by the end of the algorithm, this has a single
|
||||||
/// column, which contains the patterns that are missing for the match to be exhaustive.
|
/// column, which contains the patterns that are missing for the match to be exhaustive.
|
||||||
|
#[derive(Debug)]
|
||||||
struct WitnessMatrix<Cx: TypeCx>(Vec<WitnessStack<Cx>>);
|
struct WitnessMatrix<Cx: TypeCx>(Vec<WitnessStack<Cx>>);
|
||||||
|
|
||||||
impl<Cx: TypeCx> Clone for WitnessMatrix<Cx> {
|
impl<Cx: TypeCx> Clone for WitnessMatrix<Cx> {
|
||||||
@ -1273,12 +1269,6 @@ fn clone(&self) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Cx: TypeCx> fmt::Debug for WitnessMatrix<Cx> {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
fmt.debug_tuple("WitnessMatrix").field(&self.0).finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<Cx: TypeCx> WitnessMatrix<Cx> {
|
impl<Cx: TypeCx> WitnessMatrix<Cx> {
|
||||||
/// New matrix with no witnesses.
|
/// New matrix with no witnesses.
|
||||||
fn empty() -> Self {
|
fn empty() -> Self {
|
||||||
|
Loading…
Reference in New Issue
Block a user