diff options
| author | bors <bors@rust-lang.org> | 2020-02-09 10:20:46 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-02-09 10:20:46 +0000 |
| commit | 6dff769e3718c56f78a317df7167426d60895d58 (patch) | |
| tree | 26484dfcfb4f3f1709317f00c90ef60c6da46707 /src/libcore | |
| parent | 64ea639c12df0594dd891b1ba0b439c8c5eacd83 (diff) | |
| parent | 9dabf80d5517ab87d5985edfd9dc1f66af6eaa16 (diff) | |
| download | rust-6dff769e3718c56f78a317df7167426d60895d58.tar.gz rust-6dff769e3718c56f78a317df7167426d60895d58.zip | |
Auto merge of #68975 - Dylan-DPC:rollup-jzab8oh, r=Dylan-DPC
Rollup of 7 pull requests Successful merges: - #68718 (Move `rustc_hir::def_id` to `rustc_span::def_id`) - #68834 (Fix and test implementation of BTreeMap's first/last_entry, pop_first/last) - #68857 (perf: Reduce Vec allocations in normalization by passing &mut Vec) - #68918 (Don't use the word "unwrap" to describe "unwrap" methods) - #68946 (Mark several functions and methods in core::cmp as #[must_use]) - #68958 (Clean up E0277 and E0282 explanations) - #68960 (codegen: misc cleanups around debuginfo scopes and locations.) Failed merges: r? @ghost
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/cmp.rs | 13 | ||||
| -rw-r--r-- | src/libcore/option.rs | 26 | ||||
| -rw-r--r-- | src/libcore/result.rs | 112 |
3 files changed, 88 insertions, 63 deletions
diff --git a/src/libcore/cmp.rs b/src/libcore/cmp.rs index e41a7afd3e2..604be7d5f68 100644 --- a/src/libcore/cmp.rs +++ b/src/libcore/cmp.rs @@ -361,6 +361,7 @@ impl Ordering { /// assert!(data == b); /// ``` #[inline] + #[must_use] #[stable(feature = "rust1", since = "1.0.0")] pub fn reverse(self) -> Ordering { match self { @@ -398,6 +399,7 @@ impl Ordering { /// assert_eq!(result, Ordering::Less); /// ``` #[inline] + #[must_use] #[stable(feature = "ordering_chaining", since = "1.17.0")] pub fn then(self, other: Ordering) -> Ordering { match self { @@ -435,6 +437,7 @@ impl Ordering { /// assert_eq!(result, Ordering::Less); /// ``` #[inline] + #[must_use] #[stable(feature = "ordering_chaining", since = "1.17.0")] pub fn then_with<F: FnOnce() -> Ordering>(self, f: F) -> Ordering { match self { @@ -576,6 +579,7 @@ pub trait Ord: Eq + PartialOrd<Self> { /// assert_eq!(10.cmp(&5), Ordering::Greater); /// assert_eq!(5.cmp(&5), Ordering::Equal); /// ``` + #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn cmp(&self, other: &Self) -> Ordering; @@ -591,6 +595,7 @@ pub trait Ord: Eq + PartialOrd<Self> { /// ``` #[stable(feature = "ord_max_min", since = "1.21.0")] #[inline] + #[must_use] fn max(self, other: Self) -> Self where Self: Sized, @@ -610,6 +615,7 @@ pub trait Ord: Eq + PartialOrd<Self> { /// ``` #[stable(feature = "ord_max_min", since = "1.21.0")] #[inline] + #[must_use] fn min(self, other: Self) -> Self where Self: Sized, @@ -635,6 +641,7 @@ pub trait Ord: Eq + PartialOrd<Self> { /// assert!(0.clamp(-2, 1) == 0); /// assert!(2.clamp(-2, 1) == 1); /// ``` + #[must_use] #[unstable(feature = "clamp", issue = "44095")] fn clamp(self, min: Self, max: Self) -> Self where @@ -915,6 +922,7 @@ pub macro PartialOrd($item:item) { /// assert_eq!(2, cmp::min(2, 2)); /// ``` #[inline] +#[must_use] #[stable(feature = "rust1", since = "1.0.0")] pub fn min<T: Ord>(v1: T, v2: T) -> T { v1.min(v2) @@ -935,6 +943,7 @@ pub fn min<T: Ord>(v1: T, v2: T) -> T { /// assert_eq!(cmp::min_by(-2, 2, |x: &i32, y: &i32| x.abs().cmp(&y.abs())), -2); /// ``` #[inline] +#[must_use] #[unstable(feature = "cmp_min_max_by", issue = "64460")] pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T { match compare(&v1, &v2) { @@ -958,6 +967,7 @@ pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T { /// assert_eq!(cmp::min_by_key(-2, 2, |x: &i32| x.abs()), -2); /// ``` #[inline] +#[must_use] #[unstable(feature = "cmp_min_max_by", issue = "64460")] pub fn min_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T { min_by(v1, v2, |v1, v2| f(v1).cmp(&f(v2))) @@ -978,6 +988,7 @@ pub fn min_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T { /// assert_eq!(2, cmp::max(2, 2)); /// ``` #[inline] +#[must_use] #[stable(feature = "rust1", since = "1.0.0")] pub fn max<T: Ord>(v1: T, v2: T) -> T { v1.max(v2) @@ -998,6 +1009,7 @@ pub fn max<T: Ord>(v1: T, v2: T) -> T { /// assert_eq!(cmp::max_by(-2, 2, |x: &i32, y: &i32| x.abs().cmp(&y.abs())), 2); /// ``` #[inline] +#[must_use] #[unstable(feature = "cmp_min_max_by", issue = "64460")] pub fn max_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T { match compare(&v1, &v2) { @@ -1021,6 +1033,7 @@ pub fn max_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T { /// assert_eq!(cmp::max_by_key(-2, 2, |x: &i32| x.abs()), 2); /// ``` #[inline] +#[must_use] #[unstable(feature = "cmp_min_max_by", issue = "64460")] pub fn max_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T { max_by(v1, v2, |v1, v2| f(v1).cmp(&f(v2))) diff --git a/src/libcore/option.rs b/src/libcore/option.rs index e35c91206b8..9b32442371c 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -317,7 +317,7 @@ impl<T> Option<T> { // Getting to contained values ///////////////////////////////////////////////////////////////////////// - /// Unwraps an option, yielding the content of a [`Some`]. + /// Returns the contained [`Some`] value, consuming the `self` value. /// /// # Panics /// @@ -348,17 +348,22 @@ impl<T> Option<T> { } } - /// Moves the value `v` out of the `Option<T>` if it is [`Some(v)`]. + /// Returns the contained [`Some`] value, consuming the `self` value. /// - /// In general, because this function may panic, its use is discouraged. + /// Because this function may panic, its use is generally discouraged. /// Instead, prefer to use pattern matching and handle the [`None`] - /// case explicitly. + /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or + /// [`unwrap_or_default`]. + /// + /// [`unwrap_or`]: #method.unwrap_or + /// [`unwrap_or_else`]: #method.unwrap_or_else + /// [`unwrap_or_default`]: #method.unwrap_or_default /// /// # Panics /// /// Panics if the self value equals [`None`]. /// - /// [`Some(v)`]: #variant.Some + /// [`Some`]: #variant.Some /// [`None`]: #variant.None /// /// # Examples @@ -382,12 +387,13 @@ impl<T> Option<T> { } } - /// Returns the contained value or a default. + /// Returns the contained [`Some`] value or a provided default. /// /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing /// the result of a function call, it is recommended to use [`unwrap_or_else`], /// which is lazily evaluated. /// + /// [`Some`]: #variant.Some /// [`unwrap_or_else`]: #method.unwrap_or_else /// /// # Examples @@ -405,7 +411,7 @@ impl<T> Option<T> { } } - /// Returns the contained value or computes it from a closure. + /// Returns the contained [`Some`] value or computes it from a closure. /// /// # Examples /// @@ -986,7 +992,7 @@ impl<T: Clone> Option<&mut T> { } impl<T: fmt::Debug> Option<T> { - /// Unwraps an option, expecting [`None`] and returning nothing. + /// Consumes `self` while expecting [`None`] and returning nothing. /// /// # Panics /// @@ -1029,7 +1035,7 @@ impl<T: fmt::Debug> Option<T> { } } - /// Unwraps an option, expecting [`None`] and returning nothing. + /// Consumes `self` while expecting [`None`] and returning nothing. /// /// # Panics /// @@ -1074,7 +1080,7 @@ impl<T: fmt::Debug> Option<T> { } impl<T: Default> Option<T> { - /// Returns the contained value or a default + /// Returns the contained [`Some`] value or a default /// /// Consumes the `self` argument then, if [`Some`], returns the contained /// value, otherwise if [`None`], returns the [default value] for that diff --git a/src/libcore/result.rs b/src/libcore/result.rs index 809d4bace8e..0bc29e1bc66 100644 --- a/src/libcore/result.rs +++ b/src/libcore/result.rs @@ -798,8 +798,7 @@ impl<T, E> Result<T, E> { } } - /// Unwraps a result, yielding the content of an [`Ok`]. - /// Else, it returns `optb`. + /// Returns the contained [`Ok`] value or a provided default. /// /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing /// the result of a function call, it is recommended to use [`unwrap_or_else`], @@ -814,27 +813,25 @@ impl<T, E> Result<T, E> { /// Basic usage: /// /// ``` - /// let optb = 2; + /// let default = 2; /// let x: Result<u32, &str> = Ok(9); - /// assert_eq!(x.unwrap_or(optb), 9); + /// assert_eq!(x.unwrap_or(default), 9); /// /// let x: Result<u32, &str> = Err("error"); - /// assert_eq!(x.unwrap_or(optb), optb); + /// assert_eq!(x.unwrap_or(default), default); /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] - pub fn unwrap_or(self, optb: T) -> T { + pub fn unwrap_or(self, default: T) -> T { match self { Ok(t) => t, - Err(_) => optb, + Err(_) => default, } } - /// Unwraps a result, yielding the content of an [`Ok`]. - /// If the value is an [`Err`] then it calls `op` with its value. + /// Returns the contained [`Ok`] value or computes it from a closure. /// /// [`Ok`]: enum.Result.html#variant.Ok - /// [`Err`]: enum.Result.html#variant.Err /// /// # Examples /// @@ -937,7 +934,44 @@ impl<T: Clone, E> Result<&mut T, E> { } impl<T, E: fmt::Debug> Result<T, E> { - /// Unwraps a result, yielding the content of an [`Ok`]. + /// Returns the contained [`Ok`] value, consuming the `self` value. + /// + /// # Panics + /// + /// Panics if the value is an [`Err`], with a panic message including the + /// passed message, and the content of the [`Err`]. + /// + /// [`Ok`]: enum.Result.html#variant.Ok + /// [`Err`]: enum.Result.html#variant.Err + /// + /// # Examples + /// + /// Basic usage: + /// + /// ```{.should_panic} + /// let x: Result<u32, &str> = Err("emergency failure"); + /// x.expect("Testing expect"); // panics with `Testing expect: emergency failure` + /// ``` + #[inline] + #[track_caller] + #[stable(feature = "result_expect", since = "1.4.0")] + pub fn expect(self, msg: &str) -> T { + match self { + Ok(t) => t, + Err(e) => unwrap_failed(msg, &e), + } + } + + /// Returns the contained [`Ok`] value, consuming the `self` value. + /// + /// Because this function may panic, its use is generally discouraged. + /// Instead, prefer to use pattern matching and handle the [`Err`] + /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or + /// [`unwrap_or_default`]. + /// + /// [`unwrap_or`]: #method.unwrap_or + /// [`unwrap_or_else`]: #method.unwrap_or_else + /// [`unwrap_or_default`]: #method.unwrap_or_default /// /// # Panics /// @@ -969,13 +1003,15 @@ impl<T, E: fmt::Debug> Result<T, E> { Err(e) => unwrap_failed("called `Result::unwrap()` on an `Err` value", &e), } } +} - /// Unwraps a result, yielding the content of an [`Ok`]. +impl<T: fmt::Debug, E> Result<T, E> { + /// Returns the contained [`Err`] value, consuming the `self` value. /// /// # Panics /// - /// Panics if the value is an [`Err`], with a panic message including the - /// passed message, and the content of the [`Err`]. + /// Panics if the value is an [`Ok`], with a panic message including the + /// passed message, and the content of the [`Ok`]. /// /// [`Ok`]: enum.Result.html#variant.Ok /// [`Err`]: enum.Result.html#variant.Err @@ -985,22 +1021,20 @@ impl<T, E: fmt::Debug> Result<T, E> { /// Basic usage: /// /// ```{.should_panic} - /// let x: Result<u32, &str> = Err("emergency failure"); - /// x.expect("Testing expect"); // panics with `Testing expect: emergency failure` + /// let x: Result<u32, &str> = Ok(10); + /// x.expect_err("Testing expect_err"); // panics with `Testing expect_err: 10` /// ``` #[inline] #[track_caller] - #[stable(feature = "result_expect", since = "1.4.0")] - pub fn expect(self, msg: &str) -> T { + #[stable(feature = "result_expect_err", since = "1.17.0")] + pub fn expect_err(self, msg: &str) -> E { match self { - Ok(t) => t, - Err(e) => unwrap_failed(msg, &e), + Ok(t) => unwrap_failed(msg, &t), + Err(e) => e, } } -} -impl<T: fmt::Debug, E> Result<T, E> { - /// Unwraps a result, yielding the content of an [`Err`]. + /// Returns the contained [`Err`] value, consuming the `self` value. /// /// # Panics /// @@ -1031,38 +1065,10 @@ impl<T: fmt::Debug, E> Result<T, E> { Err(e) => e, } } - - /// Unwraps a result, yielding the content of an [`Err`]. - /// - /// # Panics - /// - /// Panics if the value is an [`Ok`], with a panic message including the - /// passed message, and the content of the [`Ok`]. - /// - /// [`Ok`]: enum.Result.html#variant.Ok - /// [`Err`]: enum.Result.html#variant.Err - /// - /// # Examples - /// - /// Basic usage: - /// - /// ```{.should_panic} - /// let x: Result<u32, &str> = Ok(10); - /// x.expect_err("Testing expect_err"); // panics with `Testing expect_err: 10` - /// ``` - #[inline] - #[track_caller] - #[stable(feature = "result_expect_err", since = "1.17.0")] - pub fn expect_err(self, msg: &str) -> E { - match self { - Ok(t) => unwrap_failed(msg, &t), - Err(e) => e, - } - } } impl<T: Default, E> Result<T, E> { - /// Returns the contained value or a default + /// Returns the contained [`Ok`] value or a default /// /// Consumes the `self` argument then, if [`Ok`], returns the contained /// value, otherwise if [`Err`], returns the default value for that @@ -1101,7 +1107,7 @@ impl<T: Default, E> Result<T, E> { #[unstable(feature = "unwrap_infallible", reason = "newly added", issue = "61695")] impl<T, E: Into<!>> Result<T, E> { - /// Unwraps a result that can never be an [`Err`], yielding the content of the [`Ok`]. + /// Returns the contained [`Ok`] value, but never panics. /// /// Unlike [`unwrap`], this method is known to never panic on the /// result types it is implemented for. Therefore, it can be used |
