about summary refs log tree commit diff
diff options
context:
space:
mode:
authorScott McMurray <scottmcm@users.noreply.github.com>2023-10-06 01:41:48 -0700
committerScott McMurray <scottmcm@users.noreply.github.com>2023-10-06 01:41:48 -0700
commit5432d13bb04cecf213c2753b25cfb1e366cb8026 (patch)
tree085af64798bf877e7f02d4f1b5898de356cbdfa2
parent579be69de9f98f56d92b93820eaf7e6b06b517a5 (diff)
downloadrust-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.rs8
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,
         }
     }