File tree Expand file tree Collapse file tree 19 files changed +44
-0
lines changed
rustc_data_structures/src Expand file tree Collapse file tree 19 files changed +44
-0
lines changed Original file line number Diff line number Diff line change 1515#![feature(if_let_guard)]
1616#![feature(let_chains)]
1717#![feature(min_specialization)]
18+ #![feature(spec_option_partial_eq)]
1819#![feature(negative_impls)]
1920#![feature(slice_internals)]
2021#![feature(stmt_expr_attributes)]
Original file line number Diff line number Diff line change 66#![feature(min_specialization)]
77#![feature(never_type)]
88#![feature(rustc_attrs)]
9+ #![feature(spec_option_partial_eq)]
910#![feature(stmt_expr_attributes)]
1011#![feature(trusted_step)]
1112#![feature(try_blocks)]
Original file line number Diff line number Diff line change 1313#![feature(cell_leak)]
1414#![feature(control_flow_enum)]
1515#![feature(extend_one)]
16+ #![feature(spec_option_partial_eq)]
1617#![feature(hash_raw_entry)]
1718#![feature(hasher_prefixfree_extras)]
1819#![feature(maybe_uninit_uninit_array)]
Original file line number Diff line number Diff line change 99#![feature(never_type)]
1010#![feature(rustc_attrs)]
1111#![feature(variant_count)]
12+ #![feature(spec_option_partial_eq)]
1213#![recursion_limit = "256"]
1314#![deny(rustc::untranslatable_diagnostic)]
1415#![deny(rustc::diagnostic_outside_of_impl)]
Original file line number Diff line number Diff line change @@ -65,6 +65,7 @@ This API is completely unstable and subject to change.
6565#![feature(is_sorted)]
6666#![feature(iter_intersperse)]
6767#![feature(let_chains)]
68+ #![feature(spec_option_partial_eq)]
6869#![feature(min_specialization)]
6970#![feature(never_type)]
7071#![feature(once_cell)]
Original file line number Diff line number Diff line change 33#![feature(try_blocks)]
44#![feature(never_type)]
55#![feature(min_specialization)]
6+ #![feature(spec_option_partial_eq)]
67#![feature(control_flow_enum)]
78#![feature(drain_filter)]
89#![allow(rustc::potential_query_instability)]
Original file line number Diff line number Diff line change 66#![feature(new_uninit)]
77#![feature(step_trait)]
88#![feature(stmt_expr_attributes)]
9+ #![feature(spec_option_partial_eq)]
910#![feature(test)]
1011
1112pub mod bit_set;
Original file line number Diff line number Diff line change 1919#![feature(extend_one)]
2020#![feature(let_chains)]
2121#![feature(if_let_guard)]
22+ #![feature(spec_option_partial_eq)]
2223#![feature(min_specialization)]
2324#![feature(never_type)]
2425#![feature(try_blocks)]
Original file line number Diff line number Diff line change 3434#![feature(iter_intersperse)]
3535#![feature(iter_order_by)]
3636#![feature(let_chains)]
37+ #![feature(spec_option_partial_eq)]
3738#![feature(min_specialization)]
3839#![feature(never_type)]
3940#![recursion_limit = "256"]
Original file line number Diff line number Diff line change @@ -192,6 +192,30 @@ impl Parse for Newtype {
192192 }
193193 }
194194 };
195+ let spec_partial_eq_impl = if let Lit::Int(max) = &max {
196+ if let Ok(max_val) = max.base10_parse::<u32>() {
197+ quote! {
198+ impl core::option::SpecOptionPartialEq for #name {
199+ #[inline]
200+ fn eq(l: &Option<Self>, r: &Option<Self>) -> bool {
201+ if #max_val < u32::MAX {
202+ l.map(|i| i.private).unwrap_or(#max_val+1) == r.map(|i| i.private).unwrap_or(#max_val+1)
203+ } else {
204+ match (l, r) {
205+ (Some(l), Some(r)) => r == l,
206+ (None, None) => true,
207+ _ => false
208+ }
209+ }
210+ }
211+ }
212+ }
213+ } else {
214+ quote! {}
215+ }
216+ } else {
217+ quote! {}
218+ };
195219
196220 Ok(Self(quote! {
197221 #(#attrs)*
@@ -293,6 +317,8 @@ impl Parse for Newtype {
293317
294318 #step
295319
320+ #spec_partial_eq_impl
321+
296322 impl From<#name> for u32 {
297323 #[inline]
298324 fn from(v: #name) -> u32 {
You can’t perform that action at this time.
0 commit comments