Skip to content

Commit 20f2d8b

Browse files
committed
Specialize PartialEq for Option<newtype>
1 parent 8e8fd02 commit 20f2d8b

File tree

19 files changed

+44
-0
lines changed

19 files changed

+44
-0
lines changed

compiler/rustc_ast/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
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)]

compiler/rustc_borrowck/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
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)]

compiler/rustc_data_structures/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
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)]

compiler/rustc_hir/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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)]

compiler/rustc_hir_analysis/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff 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)]

compiler/rustc_hir_typeck/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
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)]

compiler/rustc_index/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![feature(new_uninit)]
77
#![feature(step_trait)]
88
#![feature(stmt_expr_attributes)]
9+
#![feature(spec_option_partial_eq)]
910
#![feature(test)]
1011

1112
pub mod bit_set;

compiler/rustc_infer/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
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)]

compiler/rustc_lint/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
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"]

compiler/rustc_macros/src/newtype.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff 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 {

0 commit comments

Comments
 (0)