auto merge of #13657 : edwardw/rust/ppaux-ice, r=alexcrichton

Closes #13599
This commit is contained in:
bors 2014-04-22 07:31:43 -07:00
commit 92f6b925a9
3 changed files with 54 additions and 22 deletions

View File

@ -3331,6 +3331,13 @@ pub fn type_err_to_str(cx: &ctxt, err: &type_err) -> ~str {
} }
} }
fn tstore_to_closure(s: &TraitStore) -> ~str {
match s {
&UniqTraitStore => "proc".to_owned(),
&RegionTraitStore(..) => "closure".to_owned()
}
}
match *err { match *err {
terr_mismatch => "types differ".to_owned(), terr_mismatch => "types differ".to_owned(),
terr_fn_style_mismatch(values) => { terr_fn_style_mismatch(values) => {
@ -3346,9 +3353,9 @@ pub fn type_err_to_str(cx: &ctxt, err: &type_err) -> ~str {
values.expected.to_str(), values.found.to_str()) values.expected.to_str(), values.found.to_str())
} }
terr_sigil_mismatch(values) => { terr_sigil_mismatch(values) => {
format!("expected {} closure, found {} closure", format!("expected {}, found {}",
values.expected.to_str(), tstore_to_closure(&values.expected),
values.found.to_str()) tstore_to_closure(&values.found))
} }
terr_mutability => "values differ in mutability".to_owned(), terr_mutability => "values differ in mutability".to_owned(),
terr_box_mutability => "boxed values differ in mutability".to_owned(), terr_box_mutability => "boxed values differ in mutability".to_owned(),

View File

@ -2182,7 +2182,6 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
let expected_sty = unpack_expected(fcx, let expected_sty = unpack_expected(fcx,
expected, expected,
|x| Some((*x).clone())); |x| Some((*x).clone()));
let error_happened = false;
let (expected_sig, let (expected_sig,
expected_onceness, expected_onceness,
expected_bounds) = { expected_bounds) = {
@ -2192,7 +2191,24 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
replace_late_bound_regions_in_fn_sig( replace_late_bound_regions_in_fn_sig(
tcx, &cenv.sig, tcx, &cenv.sig,
|_| fcx.inh.infcx.fresh_bound_region(expr.id)); |_| fcx.inh.infcx.fresh_bound_region(expr.id));
(Some(sig), cenv.onceness, cenv.bounds) let onceness = match (&store, &cenv.store) {
// As the closure type and onceness go, only three
// combinations are legit:
// once closure
// many closure
// once proc
// If the actual and expected closure type disagree with
// each other, set expected onceness to be always Once or
// Many according to the actual type. Otherwise, it will
// yield either an illegal "many proc" or a less known
// "once closure" in the error message.
(&ty::UniqTraitStore, &ty::UniqTraitStore) |
(&ty::RegionTraitStore(..), &ty::RegionTraitStore(..)) =>
cenv.onceness,
(&ty::UniqTraitStore, _) => ast::Once,
(&ty::RegionTraitStore(..), _) => ast::Many,
};
(Some(sig), onceness, cenv.bounds)
} }
_ => { _ => {
// Not an error! Means we're inferring the closure type // Not an error! Means we're inferring the closure type
@ -2218,23 +2234,9 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
store, store,
decl, decl,
expected_sig); expected_sig);
let fty_sig = fn_ty.sig.clone();
let fty_sig; let fty = ty::mk_closure(tcx, fn_ty);
let fty = if error_happened { debug!("check_expr_fn fty={}", fcx.infcx().ty_to_str(fty));
fty_sig = FnSig {
binder_id: ast::CRATE_NODE_ID,
inputs: fn_ty.sig.inputs.iter().map(|_| ty::mk_err()).collect(),
output: ty::mk_err(),
variadic: false
};
ty::mk_err()
} else {
fty_sig = fn_ty.sig.clone();
ty::mk_closure(tcx, fn_ty.clone())
};
debug!("check_expr_fn_with_unifier fty={}",
fcx.infcx().ty_to_str(fty));
fcx.write_ty(expr.id, fty); fcx.write_ty(expr.id, fty);

View File

@ -0,0 +1,23 @@
// Copyright 2012-2014 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.
// Test that a mismatched proc / closure type is correctly reported.
fn expect_closure(_: ||) {}
fn expect_proc(_: proc()) {}
fn main() {
expect_closure(proc() {});
//~^ ERROR mismatched types: expected `||` but found `proc()` (expected closure, found proc)
expect_proc(|| {});
//~^ ERROR mismatched types: expected `proc()` but found `||` (expected proc, found closure)
}