Auto merge of #49808 - spastorino:dump_cause_ice, r=nikomatsakis
[NLL] Fix ICE when a borrow wrapped in a temporary is used after dropped Fixes #47646 r? @nikomatsakis
This commit is contained in:
commit
9c2bfcbea2
|
@ -8,11 +8,11 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use borrow_check::{Context, MirBorrowckCtxt};
|
|
||||||
use borrow_check::nll::region_infer::{Cause, RegionInferenceContext};
|
use borrow_check::nll::region_infer::{Cause, RegionInferenceContext};
|
||||||
|
use borrow_check::{Context, MirBorrowckCtxt};
|
||||||
use dataflow::BorrowData;
|
use dataflow::BorrowData;
|
||||||
use rustc::mir::{Local, Location, Mir};
|
|
||||||
use rustc::mir::visit::{MirVisitable, PlaceContext, Visitor};
|
use rustc::mir::visit::{MirVisitable, PlaceContext, Visitor};
|
||||||
|
use rustc::mir::{Local, Location, Mir};
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::DiagnosticBuilder;
|
use rustc_errors::DiagnosticBuilder;
|
||||||
use util::liveness::{self, DefUse, LivenessMode};
|
use util::liveness::{self, DefUse, LivenessMode};
|
||||||
|
@ -59,17 +59,29 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
||||||
|
|
||||||
Cause::DropVar(local, location) => {
|
Cause::DropVar(local, location) => {
|
||||||
match find_drop_use(mir, regioncx, borrow, location, local) {
|
match find_drop_use(mir, regioncx, borrow, location, local) {
|
||||||
Some(p) => {
|
Some(p) => match &mir.local_decls[local].name {
|
||||||
let local_name = mir.local_decls[local].name.unwrap();
|
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(
|
err.span_label(
|
||||||
mir.source_info(p).span,
|
mir.source_info(p).span,
|
||||||
format!(
|
"temporary later dropped here, \
|
||||||
"borrow later used here, when `{}` is dropped",
|
potentially using the reference",
|
||||||
local_name
|
);
|
||||||
),
|
}
|
||||||
);
|
},
|
||||||
}
|
|
||||||
|
|
||||||
None => {
|
None => {
|
||||||
span_bug!(
|
span_bug!(
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
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`.
|
Loading…
Reference in New Issue