]> git.lizzy.rs Git - rust.git/commitdiff
Specialize PartialEq for `Option<newtype>`
authorclubby789 <jamie@hill-daniel.co.uk>
Thu, 27 Oct 2022 12:43:26 +0000 (13:43 +0100)
committerclubby789 <jamie@hill-daniel.co.uk>
Mon, 31 Oct 2022 16:43:57 +0000 (16:43 +0000)
19 files changed:
compiler/rustc_ast/src/lib.rs
compiler/rustc_borrowck/src/lib.rs
compiler/rustc_data_structures/src/lib.rs
compiler/rustc_hir/src/lib.rs
compiler/rustc_hir_analysis/src/lib.rs
compiler/rustc_hir_typeck/src/lib.rs
compiler/rustc_index/src/lib.rs
compiler/rustc_infer/src/lib.rs
compiler/rustc_lint/src/lib.rs
compiler/rustc_macros/src/newtype.rs
compiler/rustc_middle/src/lib.rs
compiler/rustc_mir_build/src/lib.rs
compiler/rustc_mir_dataflow/src/lib.rs
compiler/rustc_mir_transform/src/lib.rs
compiler/rustc_passes/src/lib.rs
compiler/rustc_query_system/src/lib.rs
compiler/rustc_span/src/lib.rs
compiler/rustc_target/src/lib.rs
compiler/rustc_type_ir/src/lib.rs

index eeb7e56e2b12448e3b465fd29cfd6c716a76b468..da3718252624cc24117ad65003c1e39b34a1f6a7 100644 (file)
@@ -15,6 +15,7 @@
 #![feature(if_let_guard)]
 #![feature(let_chains)]
 #![feature(min_specialization)]
+#![feature(spec_option_partial_eq)]
 #![feature(negative_impls)]
 #![feature(slice_internals)]
 #![feature(stmt_expr_attributes)]
index abfe253d43df7edbf41cfdbba0e7c3bd474a56ae..75e8b9899aa9bd1183c9ded251c895347d3adf5d 100644 (file)
@@ -6,6 +6,7 @@
 #![feature(min_specialization)]
 #![feature(never_type)]
 #![feature(rustc_attrs)]
+#![feature(spec_option_partial_eq)]
 #![feature(stmt_expr_attributes)]
 #![feature(trusted_step)]
 #![feature(try_blocks)]
index 3a2000233c5d10fac7150e1956b2e33f7a9a7042..a7b2f97ac19eedef9cc9e71a65f097e23ca8296a 100644 (file)
@@ -13,6 +13,7 @@
 #![feature(cell_leak)]
 #![feature(control_flow_enum)]
 #![feature(extend_one)]
+#![feature(spec_option_partial_eq)]
 #![feature(hash_raw_entry)]
 #![feature(hasher_prefixfree_extras)]
 #![feature(maybe_uninit_uninit_array)]
index 1c55cd8fee8f922f94a92bc398f291ee68748b0e..9585f92bde30dee6f56dfcb7093c4b24d172bb12 100644 (file)
@@ -9,6 +9,7 @@
 #![feature(never_type)]
 #![feature(rustc_attrs)]
 #![feature(variant_count)]
+#![feature(spec_option_partial_eq)]
 #![recursion_limit = "256"]
 #![deny(rustc::untranslatable_diagnostic)]
 #![deny(rustc::diagnostic_outside_of_impl)]
index bd1a461b93522235cb2b6423a48da8f0f11c4dfa..a855f4c81e8f46e35b20d626fa64398018dd3c64 100644 (file)
@@ -65,6 +65,7 @@
 #![feature(is_sorted)]
 #![feature(iter_intersperse)]
 #![feature(let_chains)]
+#![feature(spec_option_partial_eq)]
 #![feature(min_specialization)]
 #![feature(never_type)]
 #![feature(once_cell)]
index 959c54866453dd8520f2ef00eaf979ce3886d264..ef089237994b618a3a92101a4942726c432e92e4 100644 (file)
@@ -3,6 +3,7 @@
 #![feature(try_blocks)]
 #![feature(never_type)]
 #![feature(min_specialization)]
+#![feature(spec_option_partial_eq)]
 #![feature(control_flow_enum)]
 #![feature(drain_filter)]
 #![allow(rustc::potential_query_instability)]
index 23a4c1f069662262f0306405815c43ed4c44ff0c..28a28d2acf065c6d486d62d970b16505c8409f18 100644 (file)
@@ -6,6 +6,7 @@
 #![feature(new_uninit)]
 #![feature(step_trait)]
 #![feature(stmt_expr_attributes)]
+#![feature(spec_option_partial_eq)]
 #![feature(test)]
 
 pub mod bit_set;
index e040634edb088da85d65e9dd86aab0dda27b22b3..d88c155dc0b0d8a243c3591bbb3ab8f1992afdf0 100644 (file)
@@ -19,6 +19,7 @@
 #![feature(extend_one)]
 #![feature(let_chains)]
 #![feature(if_let_guard)]
+#![feature(spec_option_partial_eq)]
 #![feature(min_specialization)]
 #![feature(never_type)]
 #![feature(try_blocks)]
index 5288fc542d79a0b0f200f9bab547da6cbf1fa948..367eb800b03702c66377258e295cdb64b22c30c7 100644 (file)
@@ -34,6 +34,7 @@
 #![feature(iter_intersperse)]
 #![feature(iter_order_by)]
 #![feature(let_chains)]
+#![feature(spec_option_partial_eq)]
 #![feature(min_specialization)]
 #![feature(never_type)]
 #![recursion_limit = "256"]
index 0a77b734c7641a5912810d08e7acd091fb73dd3b..fd3f5225155508d23f7d184bd93210fc863b709a 100644 (file)
@@ -192,6 +192,30 @@ fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
                 }
             }
         };
+        let spec_partial_eq_impl = if let Lit::Int(max) = &max {
+            if let Ok(max_val) = max.base10_parse::<u32>() {
+                quote! {
+                    impl core::option::SpecOptionPartialEq for #name {
+                        #[inline]
+                        fn eq(l: &Option<Self>, r: &Option<Self>) -> bool {
+                            if #max_val < u32::MAX {
+                                l.map(|i| i.private).unwrap_or(#max_val+1) == r.map(|i| i.private).unwrap_or(#max_val+1)
+                            } else {
+                                match (l, r) {
+                                    (Some(l), Some(r)) => r == l,
+                                    (None, None) => true,
+                                    _ => false
+                                }
+                            }
+                        }
+                    }
+                }
+            } else {
+                quote! {}
+            }
+        } else {
+            quote! {}
+        };
 
         Ok(Self(quote! {
             #(#attrs)*
@@ -293,6 +317,8 @@ fn index(self) -> usize {
 
             #step
 
+            #spec_partial_eq_impl
+
             impl From<#name> for u32 {
                 #[inline]
                 fn from(v: #name) -> u32 {
index a58cbc3767ed658980878daebc399a2cb7a6d672..040a33c6c291c72f8cae1f0838de87ae0ecb7ff7 100644 (file)
@@ -31,6 +31,7 @@
 #![feature(discriminant_kind)]
 #![feature(exhaustive_patterns)]
 #![feature(get_mut_unchecked)]
+#![feature(spec_option_partial_eq)]
 #![feature(if_let_guard)]
 #![feature(negative_impls)]
 #![feature(never_type)]
index b53bd3d0710a6ad15c242d60d1d0633203aa3773..7ef98c2a153ab0861ad61f07c61194e8e65fab61 100644 (file)
@@ -7,6 +7,7 @@
 #![feature(control_flow_enum)]
 #![feature(if_let_guard)]
 #![feature(let_chains)]
+#![feature(spec_option_partial_eq)]
 #![feature(min_specialization)]
 #![feature(once_cell)]
 #![recursion_limit = "256"]
index b471d04fd606f815bea91545683a9dedfad501ee..31f27860fa7fde00eb81f29bbd4690a03c126709 100644 (file)
@@ -4,6 +4,7 @@
 #![feature(min_specialization)]
 #![feature(once_cell)]
 #![feature(stmt_expr_attributes)]
+#![feature(spec_option_partial_eq)]
 #![feature(trusted_step)]
 #![recursion_limit = "256"]
 #![deny(rustc::untranslatable_diagnostic)]
index 4791be1306c1b09235074c849503800298cf8ae6..9afa1171e7c950c3a6ad59f8d151e91d50ed1e9d 100644 (file)
@@ -7,6 +7,7 @@
 #![feature(once_cell)]
 #![feature(option_get_or_insert_default)]
 #![feature(trusted_step)]
+#![feature(spec_option_partial_eq)]
 #![feature(try_blocks)]
 #![feature(yeet_expr)]
 #![feature(if_let_guard)]
index 15f60f626c89aa54be31b73707b0a34a87f80c6d..294a22d80c256b412858fe7079f651e81c76cd08 100644 (file)
@@ -11,6 +11,7 @@
 #![feature(iter_intersperse)]
 #![feature(let_chains)]
 #![feature(map_try_insert)]
+#![feature(spec_option_partial_eq)]
 #![feature(min_specialization)]
 #![feature(try_blocks)]
 #![recursion_limit = "256"]
index f47760e9ae6c8aa5818c875f8396ce4a6ff43b1d..b0781c77b4a894f02b939bba3925bf0e989864af 100644 (file)
@@ -3,6 +3,7 @@
 #![feature(hash_raw_entry)]
 #![feature(min_specialization)]
 #![feature(extern_types)]
+#![feature(spec_option_partial_eq)]
 #![allow(rustc::potential_query_instability)]
 #![deny(rustc::untranslatable_diagnostic)]
 #![deny(rustc::diagnostic_outside_of_impl)]
index 322c7104be425966930a74ff37dfb7d0219b14b5..7a1e6e36f3ea72463efe68a87a2edb8905a74999 100644 (file)
@@ -18,6 +18,7 @@
 #![feature(if_let_guard)]
 #![feature(negative_impls)]
 #![feature(min_specialization)]
+#![feature(spec_option_partial_eq)]
 #![feature(rustc_attrs)]
 #![deny(rustc::untranslatable_diagnostic)]
 #![deny(rustc::diagnostic_outside_of_impl)]
index aaba0d7f093ae0c33b1e3f11078b157f5beffd43..464214b64de1d62b74d3b506c8a0b25bfe3b7bd6 100644 (file)
@@ -14,6 +14,7 @@
 #![feature(min_specialization)]
 #![feature(never_type)]
 #![feature(rustc_attrs)]
+#![feature(spec_option_partial_eq)]
 #![feature(step_trait)]
 #![deny(rustc::untranslatable_diagnostic)]
 #![deny(rustc::diagnostic_outside_of_impl)]
index 7fbe78aa52353b98968ab4541412c77df925f043..e77da97e1dd4a58da35d510eda8f420f5ee165f1 100644 (file)
@@ -1,6 +1,7 @@
 #![feature(fmt_helpers_for_derive)]
 #![feature(min_specialization)]
 #![feature(rustc_attrs)]
+#![feature(spec_option_partial_eq)]
 #![deny(rustc::untranslatable_diagnostic)]
 #![deny(rustc::diagnostic_outside_of_impl)]