]> git.lizzy.rs Git - rust.git/commitdiff
Avoid ICE when referencing desugared local binding in borrow error
authorEsteban Küber <esteban@kuber.com.ar>
Sat, 27 Jul 2019 20:23:34 +0000 (13:23 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Sat, 27 Jul 2019 20:25:09 +0000 (13:25 -0700)
src/librustc_mir/borrow_check/conflict_errors.rs
src/test/ui/borrowck/issue-63026.rs [new file with mode: 0644]
src/test/ui/borrowck/issue-63026.stderr [new file with mode: 0644]

index 5d0e490ebea5a0549ae4e43bfa4b9d994d66bfee..77e5ac2f865142d2615999739c729910b1ab8f34 100644 (file)
@@ -1140,19 +1140,18 @@ fn try_report_cannot_return_reference_to_local(
                 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(),
+                ),
             }
         };
 
diff --git a/src/test/ui/borrowck/issue-63026.rs b/src/test/ui/borrowck/issue-63026.rs
new file mode 100644 (file)
index 0000000..86240a6
--- /dev/null
@@ -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() {}
diff --git a/src/test/ui/borrowck/issue-63026.stderr b/src/test/ui/borrowck/issue-63026.stderr
new file mode 100644 (file)
index 0000000..2289a03
--- /dev/null
@@ -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`.