]> git.lizzy.rs Git - rust.git/commitdiff
Remove the Option and bool impls for carrier and add a dummy impl
authorNick Cameron <ncameron@mozilla.com>
Tue, 9 Aug 2016 05:54:24 +0000 (17:54 +1200)
committerNick Cameron <ncameron@mozilla.com>
Fri, 19 Aug 2016 01:31:55 +0000 (13:31 +1200)
The dummy impl should ensure the same type checking behaviour as having other (real) Carrier impls.

src/libcore/ops.rs
src/test/compile-fail/question-mark-type-infer.rs [new file with mode: 0644]
src/test/run-pass/try-operator.rs

index a869b3c4f98c5c39301a098406a75263560011e8..0e32d71172b04fa9f40a2ad08867cce9bf436c0a 100644 (file)
@@ -76,7 +76,6 @@
 use fmt;
 use marker::{Sized, Unsize};
 use result::Result::{self, Ok, Err};
-use option::Option::{self, Some, None};
 
 /// The `Drop` trait is used to run some code when a value goes out of scope.
 /// This is sometimes called a 'destructor'.
@@ -2203,75 +2202,23 @@ fn translate<T>(self) -> T
     }
 }
 
-#[unstable(feature = "question_mark_carrier", issue = "31436")]
-impl<U> Carrier for Option<U> {
-    type Success = U;
-    type Error = ();
-
-    fn from_success(u: U) -> Option<U> {
-        Some(u)
-    }
+struct _DummyErrorType;
 
-    fn from_error(_: ()) -> Option<U> {
-        None
-    }
-
-    fn translate<T>(self) -> T
-        where T: Carrier<Success=U, Error=()>
-    {
-        match self {
-            Some(u) => T::from_success(u),
-            None => T::from_error(()),
-        }
-    }
-}
-
-// Implementing Carrier for bools means it's easy to write short-circuiting
-// functions. E.g.,
-// ```
-// fn foo() -> bool {
-//     if !(f() || g()) {
-//         return false;
-//     }
-//
-//     some_computation();
-//     if h() {
-//         return false;
-//     }
-//
-//     more_computation();
-//     i()
-// }
-// ```
-// becomes
-// ```
-// fn foo() -> bool {
-//     (f() || g())?;
-//     some_computation();
-//     (!h())?;
-//     more_computation();
-//     i()
-// }
-// ```
-#[unstable(feature = "question_mark_carrier", issue = "31436")]
-impl Carrier for bool {
+impl Carrier for _DummyErrorType {
     type Success = ();
     type Error = ();
 
-    fn from_success(_: ()) -> bool {
-        true
+    fn from_success(_: ()) -> _DummyErrorType {
+        _DummyErrorType
     }
 
-    fn from_error(_: ()) -> bool {
-        false
+    fn from_error(_: ()) -> _DummyErrorType {
+        _DummyErrorType
     }
 
     fn translate<T>(self) -> T
         where T: Carrier<Success=(), Error=()>
     {
-        match self {
-            true => T::from_success(()),
-            false => T::from_error(()),
-        }
+        T::from_success(())
     }
 }
diff --git a/src/test/compile-fail/question-mark-type-infer.rs b/src/test/compile-fail/question-mark-type-infer.rs
new file mode 100644 (file)
index 0000000..e15c9af
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(question_mark, question_mark_carrier)]
+
+// Test that type inference fails where there are multiple possible return types
+// for the `?` operator.
+
+fn f(x: &i32) -> Result<i32, ()> {
+    Ok(*x)
+}
+
+fn g() -> Result<Vec<i32>, ()> {
+    let l = [1, 2, 3, 4];
+    l.iter().map(f).collect()? //~ ERROR type annotations required: cannot resolve
+}
+
+fn main() {
+    g();
+}
index 8076e00fd08ac6f8432f110e9883f25426971b82..de5ccf09c5923d4ca67331f08f3afc52537c2438 100644 (file)
@@ -144,23 +144,6 @@ fn merge_error() -> Result<i32, Error> {
     Ok(s.parse::<i32>()? + 1)
 }
 
-fn option() -> Option<i32> {
-    let x = Some(42);
-    let y = x?;
-    Some(y + 2)
-}
-
-fn bool() -> bool {
-    let x = true;
-    let y = false;
-    let z = true;
-
-    (x || y)?;
-    let a: () = z?;
-    x?;
-    true
-}
-
 fn main() {
     assert_eq!(Ok(3), on_method());