From 3f490ca4bdb151b7b72bf6647d0bc4de5951667c Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Wed, 20 Dec 2017 11:20:07 -0500 Subject: [PATCH] convert region-liveness-drop{-,-no-}may-dangle.rs into ui tests The "match exact bits of CFG" approach was fragile and uninformative. --- .../nll/region-liveness-drop-no-may-dangle.rs | 52 ------------------- .../nll/drop-may-dangle.rs} | 24 ++++----- src/test/ui/nll/drop-may-dangle.stderr | 0 src/test/ui/nll/drop-no-may-dangle.rs | 43 +++++++++++++++ src/test/ui/nll/drop-no-may-dangle.stderr | 25 +++++++++ 5 files changed, 78 insertions(+), 66 deletions(-) delete mode 100644 src/test/mir-opt/nll/region-liveness-drop-no-may-dangle.rs rename src/test/{mir-opt/nll/region-liveness-drop-may-dangle.rs => ui/nll/drop-may-dangle.rs} (65%) create mode 100644 src/test/ui/nll/drop-may-dangle.stderr create mode 100644 src/test/ui/nll/drop-no-may-dangle.rs create mode 100644 src/test/ui/nll/drop-no-may-dangle.stderr diff --git a/src/test/mir-opt/nll/region-liveness-drop-no-may-dangle.rs b/src/test/mir-opt/nll/region-liveness-drop-no-may-dangle.rs deleted file mode 100644 index 058a57fe612cf..0000000000000 --- a/src/test/mir-opt/nll/region-liveness-drop-no-may-dangle.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2012-2016 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Basic test for liveness constraints: the region (`R1`) that appears -// in the type of `p` includes the points after `&v[0]` up to (but not -// including) the call to `use_x`. The `else` branch is not included. - -// ignore-tidy-linelength -// compile-flags:-Znll -Zverbose -// ^^^^^^^^^ force compiler to dump more region information - -#![allow(warnings)] - -fn use_x(_: usize) -> bool { true } - -fn main() { - let mut v = [1, 2, 3]; - let p: Wrap<& /* R1 */ usize> = Wrap { value: &v[0] }; - if true { - use_x(*p.value); - } else { - use_x(22); - } - - // `p` will get dropped here. Because the `#[may_dangle]` - // attribute is not present on `Wrap`, we must conservatively - // assume that the dtor may access the `value` field, and hence we - // must consider R1 to be live. -} - -struct Wrap { - value: T -} - -// Look ma, no `#[may_dangle]` attribute here. -impl Drop for Wrap { - fn drop(&mut self) { } -} - -// END RUST SOURCE -// START rustc.main.nll.0.mir -// | '_#6r | {bb2[3..=5], bb3[0..=2], bb4[0], bb5[0..=2], bb6[0], bb7[0..=1], bb8[0]} -// ... -// let _2: Wrap<&'_#6r usize>; -// END rustc.main.nll.0.mir diff --git a/src/test/mir-opt/nll/region-liveness-drop-may-dangle.rs b/src/test/ui/nll/drop-may-dangle.rs similarity index 65% rename from src/test/mir-opt/nll/region-liveness-drop-may-dangle.rs rename to src/test/ui/nll/drop-may-dangle.rs index c14ce6bb581de..2780b34746378 100644 --- a/src/test/mir-opt/nll/region-liveness-drop-may-dangle.rs +++ b/src/test/ui/nll/drop-may-dangle.rs @@ -12,8 +12,8 @@ // in the type of `p` includes the points after `&v[0]` up to (but not // including) the call to `use_x`. The `else` branch is not included. -// compile-flags:-Znll -Zverbose -// ^^^^^^^^^ force compiler to dump more region information +// compile-flags:-Znll -Zborrowck=mir +// must-compile-successfully #![allow(warnings)] #![feature(dropck_eyepatch)] @@ -23,28 +23,24 @@ fn use_x(_: usize) -> bool { true } fn main() { let mut v = [1, 2, 3]; - let p: Wrap<& /* R4 */ usize> = Wrap { value: &v[0] }; + let p: WrapMayDangle<& /* R4 */ usize> = WrapMayDangle { value: &v[0] }; if true { + // `p` will get dropped at end of this block. However, because of + // the `#[may_dangle]` attribute, we do not need to consider R4 + // live after this point. use_x(*p.value); } else { + v[0] += 1; use_x(22); } - // `p` will get dropped here. However, because of the - // `#[may_dangle]` attribute, we do not need to consider R4 live. + v[0] += 1; } -struct Wrap { +struct WrapMayDangle { value: T } -unsafe impl<#[may_dangle] T> Drop for Wrap { +unsafe impl<#[may_dangle] T> Drop for WrapMayDangle { fn drop(&mut self) { } } - -// END RUST SOURCE -// START rustc.main.nll.0.mir -// | '_#6r | {bb2[3..=5], bb3[0..=1]} -// ... -// let _2: Wrap<&'_#6r usize>; -// END rustc.main.nll.0.mir diff --git a/src/test/ui/nll/drop-may-dangle.stderr b/src/test/ui/nll/drop-may-dangle.stderr new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/src/test/ui/nll/drop-no-may-dangle.rs b/src/test/ui/nll/drop-no-may-dangle.rs new file mode 100644 index 0000000000000..0220858a0d59e --- /dev/null +++ b/src/test/ui/nll/drop-no-may-dangle.rs @@ -0,0 +1,43 @@ +// Copyright 2012-2016 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Basic test for liveness constraints: the region (`R1`) that appears +// in the type of `p` must include everything until `p` is dropped +// because of destructor. (Note that the stderr also identifies this +// destructor in the error message.) + +// compile-flags:-Znll -Zborrowck=mir -Znll-dump-cause + +#![allow(warnings)] +#![feature(dropck_eyepatch)] +#![feature(generic_param_attrs)] + +fn use_x(_: usize) -> bool { true } + +fn main() { + let mut v = [1, 2, 3]; + let p: WrapMayNotDangle<&usize> = WrapMayNotDangle { value: &v[0] }; + if true { + use_x(*p.value); + } else { + use_x(22); + v[0] += 1; //~ ERROR cannot assign to `v[..]` because it is borrowed + } + + v[0] += 1; //~ ERROR cannot assign to `v[..]` because it is borrowed +} + +struct WrapMayNotDangle { + value: T +} + +impl Drop for WrapMayNotDangle { + fn drop(&mut self) { } +} diff --git a/src/test/ui/nll/drop-no-may-dangle.stderr b/src/test/ui/nll/drop-no-may-dangle.stderr new file mode 100644 index 0000000000000..ef850f3a568c0 --- /dev/null +++ b/src/test/ui/nll/drop-no-may-dangle.stderr @@ -0,0 +1,25 @@ +error[E0506]: cannot assign to `v[..]` because it is borrowed + --> $DIR/drop-no-may-dangle.rs:31:9 + | +26 | let p: WrapMayNotDangle<&usize> = WrapMayNotDangle { value: &v[0] }; + | ----- borrow of `v[..]` occurs here +... +31 | v[0] += 1; //~ ERROR cannot assign to `v[..]` because it is borrowed + | ^^^^^^^^^ assignment to borrowed `v[..]` occurs here +... +35 | } + | - borrow later used here, when `p` is dropped + +error[E0506]: cannot assign to `v[..]` because it is borrowed + --> $DIR/drop-no-may-dangle.rs:34:5 + | +26 | let p: WrapMayNotDangle<&usize> = WrapMayNotDangle { value: &v[0] }; + | ----- borrow of `v[..]` occurs here +... +34 | v[0] += 1; //~ ERROR cannot assign to `v[..]` because it is borrowed + | ^^^^^^^^^ assignment to borrowed `v[..]` occurs here +35 | } + | - borrow later used here, when `p` is dropped + +error: aborting due to 2 previous errors +