about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-02-25 17:36:40 -0800
committerbors <bors@rust-lang.org>2013-02-25 17:36:40 -0800
commit580df4d99746217aacf1de9717e7f89cfdcc5383 (patch)
tree1f4c057def2892d5e7ca6025191c336cba0a527f
parent6e5705a87743503232ec927efebd00861f1ce717 (diff)
parentc4ef822dc7e4fcd05f9e4663e6f5c2196129d605 (diff)
downloadrust-580df4d99746217aacf1de9717e7f89cfdcc5383.tar.gz
rust-580df4d99746217aacf1de9717e7f89cfdcc5383.zip
auto merge of #5084 : oncemoreification/rust/issue-4517, r=brson
Patch for #4517

This works for fixed vectors, but I am unclear how slices should be printed, simply '&[...]'  or...

e.i. How should regions be printed?
-rw-r--r--src/librustc/middle/typeck/infer/mod.rs3
-rw-r--r--src/librustc/util/ppaux.rs14
-rw-r--r--src/test/compile-fail/issue-2149.rs2
-rw-r--r--src/test/compile-fail/issue-4517.rs6
4 files changed, 15 insertions, 10 deletions
diff --git a/src/librustc/middle/typeck/infer/mod.rs b/src/librustc/middle/typeck/infer/mod.rs
index b7e1b8a14ec..b55b45a3183 100644
--- a/src/librustc/middle/typeck/infer/mod.rs
+++ b/src/librustc/middle/typeck/infer/mod.rs
@@ -734,10 +734,10 @@ impl @mut InferCtxt {
 
     fn report_mismatched_types(&self, sp: span, e: ty::t, a: ty::t,
                                err: &ty::type_err) {
-        // Don't report an error if expected is ty_err
         let resolved_expected =
             self.resolve_type_vars_if_possible(e);
         let mk_msg = match ty::get(resolved_expected).sty {
+            // Don't report an error if expected is ty_err
             ty::ty_err => return,
             _ => {
                 // if I leave out : ~str, it infers &str and complains
@@ -780,4 +780,3 @@ impl @mut InferCtxt {
     }
 
 }
-
diff --git a/src/librustc/util/ppaux.rs b/src/librustc/util/ppaux.rs
index 8b0c84cff83..a337431cefd 100644
--- a/src/librustc/util/ppaux.rs
+++ b/src/librustc/util/ppaux.rs
@@ -238,19 +238,19 @@ pub fn vstore_to_str(cx: ctxt, vs: ty::vstore) -> ~str {
       ty::vstore_fixed(n) => fmt!("%u", n),
       ty::vstore_uniq => ~"~",
       ty::vstore_box => ~"@",
-      ty::vstore_slice(r) => region_to_str(cx, r)
+      ty::vstore_slice(r) => region_to_str_adorned(cx, "&", r, "/")
     }
 }
 
 pub fn vstore_ty_to_str(cx: ctxt, ty: ~str, vs: ty::vstore) -> ~str {
     match vs {
       ty::vstore_fixed(_) => {
-        fmt!("%s/%s", ty, vstore_to_str(cx, vs))
+        fmt!("[%s * %s]", ty, vstore_to_str(cx, vs))
       }
       ty::vstore_slice(_) => {
         fmt!("%s/%s", vstore_to_str(cx, vs), ty)
       }
-      _ => fmt!("%s%s", vstore_to_str(cx, vs), ty)
+      _ => fmt!("%s[%s]", vstore_to_str(cx, vs), ty)
     }
 }
 
@@ -453,13 +453,13 @@ pub fn ty_to_str(cx: ctxt, typ: t) -> ~str {
       ty_trait(did, ref substs, vs) => {
         let path = ty::item_path(cx, did);
         let base = ast_map::path_to_str(path, cx.sess.intr());
-        let result = parameterized(cx, base, substs.self_r, substs.tps);
-        vstore_ty_to_str(cx, result, vs)
+        let ty = parameterized(cx, base, substs.self_r, substs.tps);
+        fmt!("%s%s", vstore_to_str(cx, vs), ty)
       }
       ty_evec(mt, vs) => {
-        vstore_ty_to_str(cx, fmt!("[%s]", mt_to_str(cx, mt)), vs)
+        vstore_ty_to_str(cx, fmt!("%s", mt_to_str(cx, mt)), vs)
       }
-      ty_estr(vs) => vstore_ty_to_str(cx, ~"str", vs),
+      ty_estr(vs) => fmt!("%s%s", vstore_to_str(cx, vs), ~"str"),
       ty_opaque_box => ~"@?",
       ty_opaque_closure_ptr(ast::BorrowedSigil) => ~"closure&",
       ty_opaque_closure_ptr(ast::ManagedSigil) => ~"closure@",
diff --git a/src/test/compile-fail/issue-2149.rs b/src/test/compile-fail/issue-2149.rs
index 7e3ffb92950..0880cabb2ab 100644
--- a/src/test/compile-fail/issue-2149.rs
+++ b/src/test/compile-fail/issue-2149.rs
@@ -22,6 +22,6 @@ impl<A> vec_monad<A> for ~[A] {
 }
 fn main() {
     ["hi"].bind(|x| [x] );
-    //~^ ERROR type `[&static/str]/1` does not implement any method in scope named `bind`
+    //~^ ERROR type `[&static/str * 1]` does not implement any method in scope named `bind`
     //~^^ ERROR Unconstrained region variable
 }
diff --git a/src/test/compile-fail/issue-4517.rs b/src/test/compile-fail/issue-4517.rs
new file mode 100644
index 00000000000..18caaa697a1
--- /dev/null
+++ b/src/test/compile-fail/issue-4517.rs
@@ -0,0 +1,6 @@
+fn bar(int_param: int) {}
+
+fn main() {
+     let foo: [u8 * 4] = [1u8, ..4u8];
+     bar(foo); //~ ERROR mismatched types: expected `int` but found `[u8 * 4]` (expected int but found vector)
+}