From aac1298122ae9c7838b72f775f1f6d2a35444cc1 Mon Sep 17 00:00:00 2001
From: Tim Chevalier <chevalier@alum.wellesley.edu>
Date: Wed, 22 May 2013 19:51:21 -0700
Subject: [PATCH] testsuite: Add test cases that pass

---
 src/test/compile-fail/issue-4972.rs | 23 +++++++++++++
 src/test/run-pass/issue-3743.rs     | 52 +++++++++++++++++++++++++++++
 src/test/run-pass/issue-4016.rs     | 16 ++++-----
 src/test/run-pass/issue-5530.rs     | 49 +++++++++++++++++++++++++++
 4 files changed, 132 insertions(+), 8 deletions(-)
 create mode 100644 src/test/compile-fail/issue-4972.rs
 create mode 100644 src/test/run-pass/issue-3743.rs
 create mode 100644 src/test/run-pass/issue-5530.rs

diff --git a/src/test/compile-fail/issue-4972.rs b/src/test/compile-fail/issue-4972.rs
new file mode 100644
index 00000000000..bd74199dabd
--- /dev/null
+++ b/src/test/compile-fail/issue-4972.rs
@@ -0,0 +1,23 @@
+// Copyright 2013 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.
+
+trait MyTrait { }
+
+pub enum TraitWrapper {
+    A(~MyTrait),
+}
+
+fn get_tw_map<'lt>(tw: &'lt TraitWrapper) -> &'lt MyTrait {
+    match *tw {
+        A(~ref map) => map, //~ ERROR mismatched types: expected `~MyTrait` but found a ~-box pattern
+    }
+}
+
+pub fn main() {}
\ No newline at end of file
diff --git a/src/test/run-pass/issue-3743.rs b/src/test/run-pass/issue-3743.rs
new file mode 100644
index 00000000000..e9c2ab87c2b
--- /dev/null
+++ b/src/test/run-pass/issue-3743.rs
@@ -0,0 +1,52 @@
+// Copyright 2013 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.
+
+use std::io;
+
+struct Vec2 {
+    x: float,
+    y: float
+}
+
+// methods we want to export as methods as well as operators
+impl Vec2 {
+#[inline(always)]
+    fn vmul(self, other: float) -> Vec2 {
+        Vec2 { x: self.x * other, y: self.y * other }
+    }
+}
+
+// Right-hand-side operator visitor pattern
+trait RhsOfVec2Mul<Result> { fn mul_vec2_by(&self, lhs: &Vec2) -> Result; }
+
+// Vec2's implementation of Mul "from the other side" using the above trait
+impl<Res, Rhs: RhsOfVec2Mul<Res>> Mul<Rhs,Res> for Vec2 {
+    fn mul(&self, rhs: &Rhs) -> Res { rhs.mul_vec2_by(self) }
+}
+
+// Implementation of 'float as right-hand-side of Vec2::Mul'
+impl RhsOfVec2Mul<Vec2> for float {
+    fn mul_vec2_by(&self, lhs: &Vec2) -> Vec2 { lhs.vmul(*self) }
+}
+
+// Usage with failing inference
+pub fn main() {
+    let a = Vec2 { x: 3f, y: 4f };
+
+    // the following compiles and works properly
+    let v1: Vec2 = a * 3f;
+    io::println(fmt!("%f %f", v1.x, v1.y));
+
+    // the following compiles but v2 will not be Vec2 yet and
+    // using it later will cause an error that the type of v2
+    // must be known
+    let v2 = a * 3f;
+    io::println(fmt!("%f %f", v2.x, v2.y)); // error regarding v2's type
+}
diff --git a/src/test/run-pass/issue-4016.rs b/src/test/run-pass/issue-4016.rs
index 4e65a7063e7..6b0dd6cb947 100644
--- a/src/test/run-pass/issue-4016.rs
+++ b/src/test/run-pass/issue-4016.rs
@@ -1,4 +1,5 @@
-// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// xfail-fast
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
 // file at the top-level directory of this distribution and at
 // http://rust-lang.org/COPYRIGHT.
 //
@@ -8,19 +9,18 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// xfail-test
 extern mod extra;
 
-use hashmap;
+use std::result;
 use extra::json;
-use extra::serialization::{Deserializable, deserialize};
+use extra::serialize::Decodable;
 
-trait JD : Deserializable<json::Deserializer> { }
-//type JD = Deserializable<json::Deserializer>;
+trait JD : Decodable<json::Decoder> { }
 
-fn exec<T:JD>() {
+fn exec<T: JD>() {
     let doc = result::unwrap(json::from_str(""));
-    let _v: T = deserialize(&json::Deserializer(doc));
+    let mut decoder = json::Decoder(doc);
+    let _v: T = Decodable::decode(&mut decoder);
     fail!()
 }
 
diff --git a/src/test/run-pass/issue-5530.rs b/src/test/run-pass/issue-5530.rs
new file mode 100644
index 00000000000..002435fcb36
--- /dev/null
+++ b/src/test/run-pass/issue-5530.rs
@@ -0,0 +1,49 @@
+// Copyright 2013 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.
+
+// xfail-test
+
+enum Enum {
+    Foo { foo: uint },
+    Bar { bar: uint }
+}
+
+fn fun1(e1: &Enum, e2: &Enum) -> uint {
+    match (e1, e2) {
+        (&Foo { foo: _ }, &Foo { foo: _ }) => 0,
+        (&Foo { foo: _ }, &Bar { bar: _ }) => 1,
+        (&Bar { bar: _ }, &Bar { bar: _ }) => 2,
+        (&Bar { bar: _ }, &Foo { foo: _ }) => 3,
+    }
+}
+
+fn fun2(e1: &Enum, e2: &Enum) -> uint {
+    match (e1, e2) {
+        (&Foo { foo: _ }, &Foo { foo: _ }) => 0,
+        (&Foo { foo: _ }, _              ) => 1,
+        (&Bar { bar: _ }, &Bar { bar: _ }) => 2,
+        (&Bar { bar: _ }, _              ) => 3,
+    }
+}
+
+pub fn main() {
+    let foo = Foo { foo: 1 };
+    let bar = Bar { bar: 1 };
+
+    assert_eq!(fun1(&foo, &foo), 0);
+    assert_eq!(fun1(&foo, &bar), 1);
+    assert_eq!(fun1(&bar, &bar), 2);
+    assert_eq!(fun1(&bar, &foo), 3);
+
+    assert_eq!(fun2(&foo, &foo), 0);
+    assert_eq!(fun2(&foo, &bar), 1); // fun2 returns 0
+    assert_eq!(fun2(&bar, &bar), 2);
+    assert_eq!(fun2(&bar, &foo), 3); // fun2 returns 2
+}