Erase regions when checking for missing Copy predicates
This commit is contained in:
parent
38a0b81b1c
commit
5ddaa2d5e5
3 changed files with 41 additions and 2 deletions
|
@ -448,8 +448,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
self.mir_hir_id(),
|
||||
rustc_infer::traits::ObligationCauseCode::MiscObligation,
|
||||
);
|
||||
fulfill_cx.register_bound(&infcx, self.param_env, ty, copy_did, cause);
|
||||
let errors = fulfill_cx.select_where_possible(&infcx);
|
||||
fulfill_cx.register_bound(
|
||||
&infcx,
|
||||
self.param_env,
|
||||
// Erase any region vids from the type, which may not be resolved
|
||||
infcx.tcx.erase_regions(ty),
|
||||
copy_did,
|
||||
cause,
|
||||
);
|
||||
// Select all, including ambiguous predicates
|
||||
let errors = fulfill_cx.select_all_or_error(&infcx);
|
||||
|
||||
// Only emit suggestion if all required predicates are on generic
|
||||
errors
|
||||
|
|
17
src/test/ui/borrowck/copy-suggestion-region-vid.rs
Normal file
17
src/test/ui/borrowck/copy-suggestion-region-vid.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
pub struct DataStruct();
|
||||
|
||||
pub struct HelperStruct<'n> {
|
||||
pub helpers: [Vec<&'n i64>; 2],
|
||||
pub is_empty: bool,
|
||||
}
|
||||
|
||||
impl DataStruct {
|
||||
pub fn f(&self) -> HelperStruct {
|
||||
let helpers = [vec![], vec![]];
|
||||
|
||||
HelperStruct { helpers, is_empty: helpers[0].is_empty() }
|
||||
//~^ ERROR borrow of moved value
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
14
src/test/ui/borrowck/copy-suggestion-region-vid.stderr
Normal file
14
src/test/ui/borrowck/copy-suggestion-region-vid.stderr
Normal file
|
@ -0,0 +1,14 @@
|
|||
error[E0382]: borrow of moved value: `helpers`
|
||||
--> $DIR/copy-suggestion-region-vid.rs:12:43
|
||||
|
|
||||
LL | let helpers = [vec![], vec![]];
|
||||
| ------- move occurs because `helpers` has type `[Vec<&i64>; 2]`, which does not implement the `Copy` trait
|
||||
LL |
|
||||
LL | HelperStruct { helpers, is_empty: helpers[0].is_empty() }
|
||||
| ------- ^^^^^^^^^^^^^^^^^^^^^ value borrowed here after move
|
||||
| |
|
||||
| value moved here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0382`.
|
Loading…
Add table
Reference in a new issue