Avoid ICE when referencing desugared local binding in borrow error
This commit is contained in:
parent
03f19f7ff1
commit
b523b2d51e
3 changed files with 42 additions and 13 deletions
|
|
@ -1140,19 +1140,18 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||
bug!("try_report_cannot_return_reference_to_local: not a local")
|
||||
};
|
||||
match self.body.local_kind(*local) {
|
||||
LocalKind::ReturnPointer | LocalKind::Temp => {
|
||||
(
|
||||
"temporary value".to_string(),
|
||||
"temporary value created here".to_string(),
|
||||
)
|
||||
}
|
||||
LocalKind::Arg => {
|
||||
(
|
||||
"function parameter".to_string(),
|
||||
"function parameter borrowed here".to_string(),
|
||||
)
|
||||
},
|
||||
LocalKind::Var => bug!("local variable without a name"),
|
||||
LocalKind::ReturnPointer | LocalKind::Temp => (
|
||||
"temporary value".to_string(),
|
||||
"temporary value created here".to_string(),
|
||||
),
|
||||
LocalKind::Arg => (
|
||||
"function parameter".to_string(),
|
||||
"function parameter borrowed here".to_string(),
|
||||
),
|
||||
LocalKind::Var => (
|
||||
"local binding".to_string(),
|
||||
"local binding introduced here".to_string(),
|
||||
),
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
18
src/test/ui/borrowck/issue-63026.rs
Normal file
18
src/test/ui/borrowck/issue-63026.rs
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
use std::collections::HashMap;
|
||||
use std::hash::Hash;
|
||||
|
||||
fn group_by<I, F, T>(xs: &mut I, f: F) -> HashMap<T, Vec<&I::Item>>
|
||||
where
|
||||
I: Iterator,
|
||||
F: Fn(&I::Item) -> T,
|
||||
T: Eq + Hash,
|
||||
{
|
||||
let mut result = HashMap::new();
|
||||
for ref x in xs {
|
||||
let key = f(x);
|
||||
result.entry(key).or_insert(Vec::new()).push(x);
|
||||
}
|
||||
result //~ ERROR cannot return value referencing local binding
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
12
src/test/ui/borrowck/issue-63026.stderr
Normal file
12
src/test/ui/borrowck/issue-63026.stderr
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0515]: cannot return value referencing local binding
|
||||
--> $DIR/issue-63026.rs:15:5
|
||||
|
|
||||
LL | for ref x in xs {
|
||||
| -- local binding introduced here
|
||||
...
|
||||
LL | result
|
||||
| ^^^^^^ returns a value referencing data owned by the current function
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0515`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue