4951e3ad9e
When evaluating an `ExprKind::Call`, we first have to `check_expr` on it's callee. When this one is a `ExprKind::Path`, we had to evaluate the bounds introduced for its arguments, but by the time we evaluated them we no longer had access to the argument spans. Now we special case this so that we can point at the right place on unsatisfied bounds. This also allows the E0277 deduplication to kick in correctly, so we now emit fewer errors.
29 lines
906 B
Rust
29 lines
906 B
Rust
// Checks that certain traits for which we don't want to suggest borrowing
|
|
// are blacklisted and don't cause the suggestion to be issued.
|
|
|
|
#![feature(generators)]
|
|
|
|
fn f_copy<T: Copy>(t: T) {}
|
|
fn f_clone<T: Clone>(t: T) {}
|
|
fn f_unpin<T: Unpin>(t: T) {}
|
|
fn f_sized<T: Sized>(t: T) {}
|
|
fn f_send<T: Send>(t: T) {}
|
|
|
|
struct S;
|
|
|
|
fn main() {
|
|
f_copy("".to_string()); //~ ERROR: the trait bound `String: Copy` is not satisfied [E0277]
|
|
f_clone(S); //~ ERROR: the trait bound `S: Clone` is not satisfied [E0277]
|
|
f_unpin(static || { yield; });
|
|
//~^ ERROR: cannot be unpinned [E0277]
|
|
|
|
let cl = || ();
|
|
let ref_cl: &dyn Fn() -> () = &cl;
|
|
f_sized(*ref_cl);
|
|
//~^ ERROR: the size for values of type `dyn Fn()` cannot be known at compilation time [E0277]
|
|
|
|
use std::rc::Rc;
|
|
let rc = Rc::new(0);
|
|
f_send(rc); //~ ERROR: `Rc<{integer}>` cannot be sent between threads safely [E0277]
|
|
}
|