From 1d0c015f9b5e4da3695ed23f269dc51a8d09b8a9 Mon Sep 17 00:00:00 2001 From: Mikhail Babenko Date: Mon, 25 Nov 2019 00:29:40 +0300 Subject: [PATCH] added enclosing_scope attr to Try trait and fixed ui tests accordingly --- src/libcore/ops/try.rs | 7 ++-- .../async-await/try-on-option-in-async.stderr | 30 +++++++++++--- .../disallowed-positions.stderr | 39 ++++++++++++++++--- src/test/ui/try-on-option-diagnostics.stderr | 19 +++++++-- src/test/ui/try-on-option.stderr | 9 ++++- src/test/ui/try-operator-on-main.stderr | 11 +++++- 6 files changed, 92 insertions(+), 23 deletions(-) diff --git a/src/libcore/ops/try.rs b/src/libcore/ops/try.rs index 4f4652084a801..a748ee87ef99a 100644 --- a/src/libcore/ops/try.rs +++ b/src/libcore/ops/try.rs @@ -5,19 +5,20 @@ /// extracting those success or failure values from an existing instance and /// creating a new instance from a success or failure value. #[unstable(feature = "try_trait", issue = "42327")] -#[rustc_on_unimplemented( +#[cfg_attr(not(bootstrap), rustc_on_unimplemented( on(all( any(from_method="from_error", from_method="from_ok"), from_desugaring="QuestionMark"), message="the `?` operator can only be used in {ItemContext} \ that returns `Result` or `Option` \ (or another type that implements `{Try}`)", -label="cannot use the `?` operator in {ItemContext} that returns `{Self}`"), +label="cannot use the `?` operator in {ItemContext} that returns `{Self}`", +enclosing_scope="this function should return `Result` or `Option` to accept `?`"), on(all(from_method="into_result", from_desugaring="QuestionMark"), message="the `?` operator can only be applied to values \ that implement `{Try}`", label="the `?` operator cannot be applied to type `{Self}`") -)] +))] #[doc(alias = "?")] pub trait Try { /// The type of this value when viewed as successful. diff --git a/src/test/ui/async-await/try-on-option-in-async.stderr b/src/test/ui/async-await/try-on-option-in-async.stderr index 7d31f60efdc6a..46f8f41076bf5 100644 --- a/src/test/ui/async-await/try-on-option-in-async.stderr +++ b/src/test/ui/async-await/try-on-option-in-async.stderr @@ -1,8 +1,14 @@ error[E0277]: the `?` operator can only be used in an async block that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-on-option-in-async.rs:8:9 | -LL | x?; - | ^^ cannot use the `?` operator in an async block that returns `{integer}` +LL | async { + | ___________- +LL | | let x: Option = None; +LL | | x?; + | | ^^ cannot use the `?` operator in an async block that returns `{integer}` +LL | | 22 +LL | | }.await + | |_____- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `{integer}` = note: required by `std::ops::Try::from_error` @@ -10,8 +16,14 @@ LL | x?; error[E0277]: the `?` operator can only be used in an async closure that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-on-option-in-async.rs:16:9 | -LL | x?; - | ^^ cannot use the `?` operator in an async closure that returns `u32` +LL | let async_closure = async || { + | __________________________________- +LL | | let x: Option = None; +LL | | x?; + | | ^^ cannot use the `?` operator in an async closure that returns `u32` +LL | | 22_u32 +LL | | }; + | |_____- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `u32` = note: required by `std::ops::Try::from_error` @@ -19,8 +31,14 @@ LL | x?; error[E0277]: the `?` operator can only be used in an async function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-on-option-in-async.rs:25:5 | -LL | x?; - | ^^ cannot use the `?` operator in an async function that returns `u32` +LL | async fn an_async_function() -> u32 { + | _____________________________________- +LL | | let x: Option = None; +LL | | x?; + | | ^^ cannot use the `?` operator in an async function that returns `u32` +LL | | 22 +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `u32` = note: required by `std::ops::Try::from_error` diff --git a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr index f24ea0505e785..1143bddfe45a3 100644 --- a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr +++ b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr @@ -575,8 +575,17 @@ LL | if (let 0 = 0)? {} error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/disallowed-positions.rs:46:8 | -LL | if (let 0 = 0)? {} - | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +LL | / fn nested_within_if_expr() { +LL | | if &let 0 = 0 {} +LL | | +LL | | +... | +LL | | if (let 0 = 0)? {} + | | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +... | +LL | | if let true = let true = true {} +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `()` = note: required by `std::ops::Try::from_error` @@ -754,8 +763,17 @@ LL | while (let 0 = 0)? {} error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/disallowed-positions.rs:110:11 | -LL | while (let 0 = 0)? {} - | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +LL | / fn nested_within_while_expr() { +LL | | while &let 0 = 0 {} +LL | | +LL | | +... | +LL | | while (let 0 = 0)? {} + | | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +... | +LL | | while let true = let true = true {} +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `()` = note: required by `std::ops::Try::from_error` @@ -924,8 +942,17 @@ LL | (let 0 = 0)?; error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/disallowed-positions.rs:183:5 | -LL | (let 0 = 0)?; - | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +LL | / fn outside_if_and_while_expr() { +LL | | &let 0 = 0; +LL | | +LL | | !let 0 = 0; +... | +LL | | (let 0 = 0)?; + | | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +... | +LL | | +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `()` = note: required by `std::ops::Try::from_error` diff --git a/src/test/ui/try-on-option-diagnostics.stderr b/src/test/ui/try-on-option-diagnostics.stderr index 4dd515e1b5a45..ce3aca39fb8fb 100644 --- a/src/test/ui/try-on-option-diagnostics.stderr +++ b/src/test/ui/try-on-option-diagnostics.stderr @@ -1,8 +1,13 @@ error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-on-option-diagnostics.rs:7:5 | -LL | x?; - | ^^ cannot use the `?` operator in a function that returns `u32` +LL | / fn a_function() -> u32 { +LL | | let x: Option = None; +LL | | x?; + | | ^^ cannot use the `?` operator in a function that returns `u32` +LL | | 22 +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `u32` = note: required by `std::ops::Try::from_error` @@ -10,8 +15,14 @@ LL | x?; error[E0277]: the `?` operator can only be used in a closure that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-on-option-diagnostics.rs:14:9 | -LL | x?; - | ^^ cannot use the `?` operator in a closure that returns `{integer}` +LL | let a_closure = || { + | _____________________- +LL | | let x: Option = None; +LL | | x?; + | | ^^ cannot use the `?` operator in a closure that returns `{integer}` +LL | | 22 +LL | | }; + | |_____- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `{integer}` = note: required by `std::ops::Try::from_error` diff --git a/src/test/ui/try-on-option.stderr b/src/test/ui/try-on-option.stderr index db5046f8c151a..07615b52a48a5 100644 --- a/src/test/ui/try-on-option.stderr +++ b/src/test/ui/try-on-option.stderr @@ -10,8 +10,13 @@ LL | x?; error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-on-option.rs:13:5 | -LL | x?; - | ^^ cannot use the `?` operator in a function that returns `u32` +LL | / fn bar() -> u32 { +LL | | let x: Option = None; +LL | | x?; + | | ^^ cannot use the `?` operator in a function that returns `u32` +LL | | 22 +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `u32` = note: required by `std::ops::Try::from_error` diff --git a/src/test/ui/try-operator-on-main.stderr b/src/test/ui/try-operator-on-main.stderr index d2f1a04837b86..d8ba264583e45 100644 --- a/src/test/ui/try-operator-on-main.stderr +++ b/src/test/ui/try-operator-on-main.stderr @@ -1,8 +1,15 @@ error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) --> $DIR/try-operator-on-main.rs:9:5 | -LL | std::fs::File::open("foo")?; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +LL | / fn main() { +LL | | // error for a `Try` type on a non-`Try` fn +LL | | std::fs::File::open("foo")?; + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` +LL | | +... | +LL | | try_trait_generic::<()>(); +LL | | } + | |_- this function should return `Result` or `Option` to accept `?` | = help: the trait `std::ops::Try` is not implemented for `()` = note: required by `std::ops::Try::from_error`