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

+1
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

+1
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

+1
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

+1
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

+1
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

+1
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

+1
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

+1
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

+1
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

+26
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 {

compiler/rustc_middle/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#![feature(discriminant_kind)]
3232
#![feature(exhaustive_patterns)]
3333
#![feature(get_mut_unchecked)]
34+
#![feature(spec_option_partial_eq)]
3435
#![feature(if_let_guard)]
3536
#![feature(negative_impls)]
3637
#![feature(never_type)]

compiler/rustc_mir_build/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#![feature(control_flow_enum)]
88
#![feature(if_let_guard)]
99
#![feature(let_chains)]
10+
#![feature(spec_option_partial_eq)]
1011
#![feature(min_specialization)]
1112
#![feature(once_cell)]
1213
#![recursion_limit = "256"]

compiler/rustc_mir_dataflow/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#![feature(min_specialization)]
55
#![feature(once_cell)]
66
#![feature(stmt_expr_attributes)]
7+
#![feature(spec_option_partial_eq)]
78
#![feature(trusted_step)]
89
#![recursion_limit = "256"]
910
#![deny(rustc::untranslatable_diagnostic)]

compiler/rustc_mir_transform/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#![feature(once_cell)]
88
#![feature(option_get_or_insert_default)]
99
#![feature(trusted_step)]
10+
#![feature(spec_option_partial_eq)]
1011
#![feature(try_blocks)]
1112
#![feature(yeet_expr)]
1213
#![feature(if_let_guard)]

compiler/rustc_passes/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#![feature(iter_intersperse)]
1212
#![feature(let_chains)]
1313
#![feature(map_try_insert)]
14+
#![feature(spec_option_partial_eq)]
1415
#![feature(min_specialization)]
1516
#![feature(try_blocks)]
1617
#![recursion_limit = "256"]

compiler/rustc_query_system/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#![feature(hash_raw_entry)]
44
#![feature(min_specialization)]
55
#![feature(extern_types)]
6+
#![feature(spec_option_partial_eq)]
67
#![allow(rustc::potential_query_instability)]
78
#![deny(rustc::untranslatable_diagnostic)]
89
#![deny(rustc::diagnostic_outside_of_impl)]

compiler/rustc_span/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#![feature(if_let_guard)]
1919
#![feature(negative_impls)]
2020
#![feature(min_specialization)]
21+
#![feature(spec_option_partial_eq)]
2122
#![feature(rustc_attrs)]
2223
#![deny(rustc::untranslatable_diagnostic)]
2324
#![deny(rustc::diagnostic_outside_of_impl)]

compiler/rustc_target/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#![feature(min_specialization)]
1515
#![feature(never_type)]
1616
#![feature(rustc_attrs)]
17+
#![feature(spec_option_partial_eq)]
1718
#![feature(step_trait)]
1819
#![deny(rustc::untranslatable_diagnostic)]
1920
#![deny(rustc::diagnostic_outside_of_impl)]

compiler/rustc_type_ir/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![feature(fmt_helpers_for_derive)]
22
#![feature(min_specialization)]
33
#![feature(rustc_attrs)]
4+
#![feature(spec_option_partial_eq)]
45
#![deny(rustc::untranslatable_diagnostic)]
56
#![deny(rustc::diagnostic_outside_of_impl)]
67

0 commit comments

Comments
 (0)