summaryrefslogtreecommitdiffstats
path: root/tests/ui/traits/question-mark-result-err-mismatch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/traits/question-mark-result-err-mismatch.rs')
-rw-r--r--tests/ui/traits/question-mark-result-err-mismatch.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/tests/ui/traits/question-mark-result-err-mismatch.rs b/tests/ui/traits/question-mark-result-err-mismatch.rs
new file mode 100644
index 000000000..0ca18b5b0
--- /dev/null
+++ b/tests/ui/traits/question-mark-result-err-mismatch.rs
@@ -0,0 +1,59 @@
+fn foo() -> Result<String, String> { //~ NOTE expected `String` because of this
+ let test = String::from("one,two");
+ let x = test
+ .split_whitespace()
+ .next()
+ .ok_or_else(|| {
+ "Couldn't split the test string"
+ });
+ let one = x
+ .map(|s| ())
+ .map_err(|e| { //~ NOTE this can't be annotated with `?` because it has type `Result<_, ()>`
+ e; //~ HELP remove this semicolon
+ })
+ .map(|()| "")?; //~ ERROR `?` couldn't convert the error to `String`
+ //~^ NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE the trait `From<()>` is not implemented for `String`
+ //~| NOTE the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
+ //~| NOTE required for `Result<String, String>` to implement `FromResidual<Result<Infallible, ()>>`
+ Ok(one.to_string())
+}
+
+fn bar() -> Result<(), String> { //~ NOTE expected `String` because of this
+ let x = foo(); //~ NOTE this has type `Result<_, String>`
+ let one = x
+ .map(|s| ())
+ .map_err(|_| ())?; //~ ERROR `?` couldn't convert the error to `String`
+ //~^ NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE this can't be annotated with `?` because it has type `Result<_, ()>`
+ //~| NOTE the trait `From<()>` is not implemented for `String`
+ //~| NOTE the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
+ //~| NOTE required for `Result<(), String>` to implement `FromResidual<Result<Infallible, ()>>`
+ //~| HELP the following other types implement trait `From<T>`:
+ Ok(one)
+}
+
+fn baz() -> Result<String, String> { //~ NOTE expected `String` because of this
+ let test = String::from("one,two");
+ let one = test
+ .split_whitespace()
+ .next()
+ .ok_or_else(|| { //~ NOTE this can't be annotated with `?` because it has type `Result<_, ()>`
+ "Couldn't split the test string"; //~ HELP remove this semicolon
+ })?;
+ //~^ ERROR `?` couldn't convert the error to `String`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE in this expansion of desugaring of operator `?`
+ //~| NOTE the trait `From<()>` is not implemented for `String`
+ //~| NOTE the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
+ //~| NOTE required for `Result<String, String>` to implement `FromResidual<Result<Infallible, ()>>`
+ Ok(one.to_string())
+}
+
+fn main() {}