diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 9c54b86dcd3..fe2cba1180c 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -22,6 +22,7 @@ import middle::metadata; import util::common::*; import util::data::interner; import pretty::ppaux::ty_to_str; +import pretty::ppaux::mode_str_1; export node_id_to_monotype; @@ -292,6 +293,7 @@ tag type_err { terr_meth_count; terr_obj_meths(ast::ident, ast::ident); terr_arg_count; + terr_mode_mismatch(mode, mode); } type ty_param_count_and_ty = tup(uint, t); @@ -1984,9 +1986,8 @@ mod unify { auto result_mode; if (expected_input.mode != actual_input.mode) { - // FIXME this is the wrong error - - ret fn_common_res_err(ures_err(terr_arg_count)); + ret fn_common_res_err(ures_err(terr_mode_mismatch( + expected_input.mode, actual_input.mode))); } else { result_mode = expected_input.mode; } auto result = unify_step(cx, expected_input.ty, actual_input.ty); alt (result) { @@ -2584,6 +2585,11 @@ fn type_err_to_str(&ty::type_err err) -> str { ret "expected an obj with method '" + e_meth + "' but found one with method '" + a_meth + "'"; } + case (terr_mode_mismatch(?e_mode, ?a_mode)) { + ret "expected argument mode " + mode_str_1(e_mode) + " but found " + + mode_str_1(a_mode); + fail; + } } } diff --git a/src/comp/pretty/ppaux.rs b/src/comp/pretty/ppaux.rs index de782e2fe6c..97c932cdd5f 100644 --- a/src/comp/pretty/ppaux.rs +++ b/src/comp/pretty/ppaux.rs @@ -5,6 +5,7 @@ import std::str; import std::option; import std::option::none; import std::option::some; +import middle::ty; import middle::ty::*; import front::lexer; import front::ast; @@ -18,15 +19,25 @@ import util::common::istr; import util::common::uistr; import util::common::ty_mach_to_str; +fn mode_str(&ty::mode m) -> str { + alt (m) { + case (mo_val) { "" } + case (mo_alias(false)) { "&" } + case (mo_alias(true)) { "&mutable " } + } +} + +fn mode_str_1(&ty::mode m) -> str { + alt (m) { + case (mo_val) { "val" } + case (_) { mode_str(m) } + } +} + fn ty_to_str(&ctxt cx, &t typ) -> str { fn fn_input_to_str(&ctxt cx, &rec(middle::ty::mode mode, t ty) input) -> str { - auto s = - alt (input.mode) { - case (mo_val) { "" } - case (mo_alias(false)) { "&" } - case (mo_alias(true)) { "&mutable " } - }; + auto s = mode_str(input.mode); ret s + ty_to_str(cx, input.ty); } fn fn_to_str(&ctxt cx, ast::proto proto, option::t[ast::ident] ident, diff --git a/src/test/compile-fail/alias-mismatch.rs b/src/test/compile-fail/alias-mismatch.rs new file mode 100644 index 00000000000..b280351db2b --- /dev/null +++ b/src/test/compile-fail/alias-mismatch.rs @@ -0,0 +1,9 @@ +// error-pattern:expected argument mode +use std; +import std::vec::map; + +fn main() { + fn f(uint i) -> bool { true } + + auto a = map(f, [5u]); +} \ No newline at end of file