about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2016-08-09 17:54:24 +1200
committerNick Cameron <ncameron@mozilla.com>2016-08-19 13:31:55 +1200
commit5aa89d8bf6dcf3f7c08f3db8f48b54676b6203b8 (patch)
treede13f67c98667e88f593e818068288a70c2b8a30
parent683bcc02955f988ab2726f1b7708baa6c1e64b7b (diff)
downloadrust-5aa89d8bf6dcf3f7c08f3db8f48b54676b6203b8.tar.gz
rust-5aa89d8bf6dcf3f7c08f3db8f48b54676b6203b8.zip
Remove the Option and bool impls for carrier and add a dummy impl
The dummy impl should ensure the same type checking behaviour as having other (real) Carrier impls.
-rw-r--r--src/libcore/ops.rs67
-rw-r--r--src/test/compile-fail/question-mark-type-infer.rs27
-rw-r--r--src/test/run-pass/try-operator.rs17
3 files changed, 34 insertions, 77 deletions
diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs
index a869b3c4f98..0e32d71172b 100644
--- a/src/libcore/ops.rs
+++ b/src/libcore/ops.rs
@@ -76,7 +76,6 @@ use cmp::PartialOrd;
 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 @@ impl<U, V> Carrier for Result<U, V> {
     }
 }
 
-#[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
index 00000000000..e15c9af41e0
--- /dev/null
+++ b/src/test/compile-fail/question-mark-type-infer.rs
@@ -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();
+}
diff --git a/src/test/run-pass/try-operator.rs b/src/test/run-pass/try-operator.rs
index 8076e00fd08..de5ccf09c59 100644
--- a/src/test/run-pass/try-operator.rs
+++ b/src/test/run-pass/try-operator.rs
@@ -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());