diff --git a/src/libcore/array/mod.rs b/src/libcore/array/mod.rs
index 937451274cfc2..79329fac88819 100644
--- a/src/libcore/array/mod.rs
+++ b/src/libcore/array/mod.rs
@@ -12,6 +12,7 @@ use crate::convert::{Infallible, TryFrom};
use crate::fmt;
use crate::hash::{self, Hash};
use crate::marker::Unsize;
+use crate::marker::{StructuralEq, StructuralPartialEq};
use crate::slice::{Iter, IterMut};
mod iter;
@@ -228,6 +229,14 @@ where
}
}
+#[unstable(feature = "structural_match", issue = "31434")]
+impl StructuralPartialEq for [A; N]
+where
+ A: StructuralPartialEq,
+ [A; N]: LengthAtMost32,
+{
+}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl PartialEq<[B; N]> for [A; N]
where
@@ -345,6 +354,14 @@ where
// __impl_slice_eq2! { [A; $N], &'b [B; $N] }
// __impl_slice_eq2! { [A; $N], &'b mut [B; $N] }
+#[unstable(feature = "structural_match", issue = "31434")]
+impl StructuralEq for [A; N]
+where
+ A: StructuralEq,
+ [A; N]: LengthAtMost32,
+{
+}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl Eq for [T; N] where [T; N]: LengthAtMost32 {}
diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs
index 604be7d5f68d0..e0df48a8002a2 100644
--- a/src/libcore/cmp.rs
+++ b/src/libcore/cmp.rs
@@ -1043,6 +1043,7 @@ pub fn max_by_key K, K: Ord>(v1: T, v2: T, mut f: F) -> T {
mod impls {
use crate::cmp::Ordering::{self, Equal, Greater, Less};
use crate::hint::unreachable_unchecked;
+ use crate::marker::{StructuralEq, StructuralPartialEq};
macro_rules! partial_eq_impl {
($($t:ty)*) => ($(
@@ -1209,6 +1210,9 @@ mod impls {
// & pointers
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl StructuralPartialEq for &A where A: StructuralPartialEq {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl PartialEq<&B> for &A
where
@@ -1259,11 +1263,18 @@ mod impls {
Ord::cmp(*self, *other)
}
}
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl StructuralEq for &A where A: StructuralEq {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl Eq for &A where A: Eq {}
// &mut pointers
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl StructuralPartialEq for &mut A where A: StructuralPartialEq {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl PartialEq<&mut B> for &mut A
where
@@ -1314,6 +1325,10 @@ mod impls {
Ord::cmp(*self, *other)
}
}
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl StructuralEq for &mut A where A: StructuralEq {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl Eq for &mut A where A: Eq {}
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs
index 2140a7be9efe8..7dce9f040209f 100644
--- a/src/libcore/slice/mod.rs
+++ b/src/libcore/slice/mod.rs
@@ -30,6 +30,7 @@ use crate::intrinsics::{assume, exact_div, is_aligned_and_not_null, unchecked_su
use crate::isize;
use crate::iter::*;
use crate::marker::{self, Copy, Send, Sized, Sync};
+use crate::marker::{StructuralEq, StructuralPartialEq};
use crate::mem;
use crate::ops::{self, FnMut, Range};
use crate::option::Option;
@@ -5752,6 +5753,9 @@ extern "C" {
fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32;
}
+#[unstable(feature = "structural_match", issue = "31434")]
+impl StructuralPartialEq for [A] where A: StructuralPartialEq {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl PartialEq<[B]> for [A]
where
@@ -5766,6 +5770,9 @@ where
}
}
+#[unstable(feature = "structural_match", issue = "31434")]
+impl StructuralEq for [A] where A: StructuralEq {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl Eq for [T] {}
diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs
index dc7637cfdb934..34005df91e192 100644
--- a/src/libcore/str/mod.rs
+++ b/src/libcore/str/mod.rs
@@ -1720,6 +1720,7 @@ Section: Trait implementations
mod traits {
use crate::cmp::Ordering;
+ use crate::marker::{StructuralEq, StructuralPartialEq};
use crate::ops;
use crate::slice::{self, SliceIndex};
@@ -1738,6 +1739,9 @@ mod traits {
}
}
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl StructuralEq for str {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl PartialEq for str {
#[inline]
@@ -1750,6 +1754,9 @@ mod traits {
}
}
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl StructuralPartialEq for str {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl Eq for str {}
diff --git a/src/libcore/tuple.rs b/src/libcore/tuple.rs
index 9f8a3a1de4201..39249b3047586 100644
--- a/src/libcore/tuple.rs
+++ b/src/libcore/tuple.rs
@@ -2,6 +2,7 @@
use crate::cmp::Ordering::*;
use crate::cmp::*;
+use crate::marker::{StructuralEq, StructuralPartialEq};
// macro for implementing n-ary tuple functions and operations
macro_rules! tuple_impls {
@@ -23,6 +24,14 @@ macro_rules! tuple_impls {
}
}
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl<$($T:StructuralPartialEq),+> StructuralPartialEq for ($($T,)+)
+ where last_type!($($T,)+): ?Sized {}
+
+ #[unstable(feature = "structural_match", issue = "31434")]
+ impl<$($T:StructuralEq),+> StructuralEq for ($($T,)+)
+ where last_type!($($T,)+): ?Sized {}
+
#[stable(feature = "rust1", since = "1.0.0")]
impl<$($T:Eq),+> Eq for ($($T,)+) where last_type!($($T,)+): ?Sized {}