rust/src/test/run-pass/issue-8860.rs
Ariel Ben-Yehuda 25416c7081 don't track borrows for empty regions
Region inference can create borrows for an empty region if the borrow is
dead. In that case, there's no reason to track the borrow, but because
there's no such thing as an EndRegion(ReEmpty) these borrows used to live
for the entire function.

Fixes #46161.
2017-12-03 02:29:04 +02:00

59 lines
1.2 KiB
Rust

// Copyright 2012-2014 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.
// compile-flags: -Z borrowck=compare
static mut DROP: isize = 0;
static mut DROP_S: isize = 0;
static mut DROP_T: isize = 0;
struct S;
impl Drop for S {
fn drop(&mut self) {
unsafe {
DROP_S += 1;
DROP += 1;
}
}
}
fn f(ref _s: S) {}
struct T { i: isize }
impl Drop for T {
fn drop(&mut self) {
unsafe {
DROP_T += 1;
DROP += 1;
}
}
}
fn g(ref _t: T) {}
fn do_test() {
let s = S;
f(s);
unsafe {
assert_eq!(1, DROP);
assert_eq!(1, DROP_S);
}
let t = T { i: 1 };
g(t);
unsafe { assert_eq!(1, DROP_T); }
}
fn main() {
do_test();
unsafe {
assert_eq!(2, DROP);
assert_eq!(1, DROP_S);
assert_eq!(1, DROP_T);
}
}