diff options
| author | Scott McMurray <scottmcm@users.noreply.github.com> | 2023-10-06 01:41:48 -0700 |
|---|---|---|
| committer | Scott McMurray <scottmcm@users.noreply.github.com> | 2023-10-06 01:41:48 -0700 |
| commit | 5432d13bb04cecf213c2753b25cfb1e366cb8026 (patch) | |
| tree | 085af64798bf877e7f02d4f1b5898de356cbdfa2 | |
| parent | 579be69de9f98f56d92b93820eaf7e6b06b517a5 (diff) | |
| download | rust-5432d13bb04cecf213c2753b25cfb1e366cb8026.tar.gz rust-5432d13bb04cecf213c2753b25cfb1e366cb8026.zip | |
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 simpler in LLVM *and* in MIR, so might as well: <https://rust.godbolt.org/z/KhdE8eToW>
| -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, } } |
