Cause::DropVar(local, location) => {
match find_drop_use(mir, regioncx, borrow, location, local) {
- Some(p) => {
- let local_name = mir.local_decls[local].name.unwrap();
-
- err.span_label(
- mir.source_info(p).span,
- format!(
- "borrow later used here, when `{}` is dropped",
- local_name
- ),
- );
- }
+ Some(p) => match &mir.local_decls[local].name {
+ Some(local_name) => {
+ err.span_label(
+ mir.source_info(p).span,
+ format!(
+ "borrow later used here, when `{}` is dropped",
+ local_name
+ ),
+ );
+ }
+ None => {
+ err.span_label(
+ mir.local_decls[local].source_info.span,
+ "borrow may end up in a temporary, created here",
+ );
+
+ err.span_label(
+ mir.source_info(p).span,
+ "temporary later dropped here, \
+ potentially using the reference",
+ );
+ }
+ },
None => {
span_bug!(
--- /dev/null
+// Copyright 2018 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.
+
+#![allow(warnings)]
+#![feature(nll)]
+
+use std::collections::BinaryHeap;
+
+fn main() {
+ let mut heap: BinaryHeap<i32> = BinaryHeap::new();
+ let borrow = heap.peek_mut();
+
+ match (borrow, ()) {
+ (Some(_), ()) => {
+ println!("{:?}", heap); //~ ERROR cannot borrow `heap` as immutable
+ }
+ _ => {}
+ };
+}
--- /dev/null
+error[E0502]: cannot borrow `heap` as immutable because it is also borrowed as mutable
+ --> $DIR/issue-47646.rs:22:30
+ |
+LL | let borrow = heap.peek_mut();
+ | ---- mutable borrow occurs here
+LL |
+LL | match (borrow, ()) {
+ | ------------ borrow may end up in a temporary, created here
+LL | (Some(_), ()) => {
+LL | println!("{:?}", heap); //~ ERROR cannot borrow `heap` as immutable
+ | ^^^^ immutable borrow occurs here
+...
+LL | };
+ | - temporary later dropped here, potentially using the reference
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0502`.