diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-10-06 21:17:50 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-06 21:17:50 +0200 |
| commit | f8dae0c20a03a584c12146c89253e2c2ef93d4b2 (patch) | |
| tree | 23b91e0c10637ee3b69adbc3991363a84b7dada1 | |
| parent | 9796dfdd563d9b7d09088b94b8e3314c61a3786c (diff) | |
| parent | 5432d13bb04cecf213c2753b25cfb1e366cb8026 (diff) | |
| download | rust-f8dae0c20a03a584c12146c89253e2c2ef93d4b2.tar.gz rust-f8dae0c20a03a584c12146c89253e2c2ef93d4b2.zip | |
Rollup merge of #116481 - scottmcm:tweak-combinators, r=cuviper
Reuse existing `Some`s in `Option::(x)or` LLVM still has trouble re-using discriminants sometimes when rebuilding a two-variant enum, so when we have the correct variant already built, just use it. That's shorter in the Rust code, as well as simpler in MIR and the optimized LLVM, so might as well: <https://rust.godbolt.org/z/KhdE8eToW> Thanks to `@veber-alex` for pointing out this opportunity in https://github.com/rust-lang/rust/issues/101210#issuecomment-1732470941
| -rw-r--r-- | library/core/src/option.rs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 9899014e85a..bdaeea66622 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -1475,7 +1475,7 @@ impl<T> Option<T> { #[stable(feature = "rust1", since = "1.0.0")] pub fn or(self, optb: Option<T>) -> Option<T> { match self { - Some(x) => Some(x), + x @ Some(_) => x, None => optb, } } @@ -1500,7 +1500,7 @@ impl<T> Option<T> { F: FnOnce() -> Option<T>, { match self { - Some(x) => Some(x), + x @ Some(_) => x, None => f(), } } @@ -1530,8 +1530,8 @@ impl<T> Option<T> { #[stable(feature = "option_xor", since = "1.37.0")] pub fn xor(self, optb: Option<T>) -> Option<T> { match (self, optb) { - (Some(a), None) => Some(a), - (None, Some(b)) => Some(b), + (a @ Some(_), None) => a, + (None, b @ Some(_)) => b, _ => None, } } |
