The `try_coerce` method coerces from a source to a target type, possibly inserting adjustments. It should guarantee that the post-adjustment type is a subtype of the target type (or else that some side-constraint has been registered which will lead to an error). However, it used to return the (possibly adjusted) source as the type of the expression rather than the target. This led to less good downstream errors. To work around this, the code around blocks -- and particular tail expressions in blocks -- had some special case manipulation. However, since that code is now using the more general `CoerceMany` construct (to account for breaks), it can no longer take advantage of that. This lead to some regressions in compile-fail tests were errors were reported at "less good" locations than before. This change modifies coercions to return the target type when successful rather the source type. This extends the behavior from blocks to all coercions. Typically this has limited effect but on a few tests yielded better errors results (and avoided regressions, of course). This change also restores the hint about removing semicolons which went missing (by giving 'force-unit' coercions a chance to add notes etc).
25 lines
884 B
Rust
25 lines
884 B
Rust
// Copyright 2012 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 vec_monad<A> {
|
|
fn bind<B, F>(&self, f: F) where F: FnMut(A) -> Vec<B>;
|
|
}
|
|
|
|
impl<A> vec_monad<A> for Vec<A> {
|
|
fn bind<B, F>(&self, mut f: F) where F: FnMut(A) -> Vec<B> {
|
|
let mut r = panic!();
|
|
for elt in self { r = r + f(*elt); }
|
|
//~^ ERROR E0277
|
|
}
|
|
}
|
|
fn main() {
|
|
["hi"].bind(|x| [x] );
|
|
//~^ ERROR no method named `bind` found for type `[&str; 1]` in the current scope
|
|
}
|