about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2017-12-20 11:20:07 -0500
committerNiko Matsakis <niko@alum.mit.edu>2017-12-20 14:38:13 -0500
commit3f490ca4bdb151b7b72bf6647d0bc4de5951667c (patch)
tree0941bc9bb9050e564eaf7757f9a357103e3c5dc2 /src/test
parentcba82561cf0773b8a2bc3358313e555ffd0352c3 (diff)
downloadrust-3f490ca4bdb151b7b72bf6647d0bc4de5951667c.tar.gz
rust-3f490ca4bdb151b7b72bf6647d0bc4de5951667c.zip
convert region-liveness-drop{-,-no-}may-dangle.rs into ui tests
The "match exact bits of CFG" approach was fragile and uninformative.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/mir-opt/nll/region-liveness-drop-no-may-dangle.rs52
-rw-r--r--src/test/ui/nll/drop-may-dangle.rs (renamed from src/test/mir-opt/nll/region-liveness-drop-may-dangle.rs)24
-rw-r--r--src/test/ui/nll/drop-may-dangle.stderr0
-rw-r--r--src/test/ui/nll/drop-no-may-dangle.rs43
-rw-r--r--src/test/ui/nll/drop-no-may-dangle.stderr25
5 files changed, 78 insertions, 66 deletions
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 058a57fe612..00000000000
--- 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 <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.
-
-// 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<T> {
-    value: T
-}
-
-// Look ma, no `#[may_dangle]` attribute here.
-impl<T> Drop for Wrap<T> {
-    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
index c14ce6bb581..2780b347463 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<T> {
+struct WrapMayDangle<T> {
     value: T
 }
 
-unsafe impl<#[may_dangle] T> Drop for Wrap<T> {
+unsafe impl<#[may_dangle] T> Drop for WrapMayDangle<T> {
     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 00000000000..e69de29bb2d
--- /dev/null
+++ b/src/test/ui/nll/drop-may-dangle.stderr
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 00000000000..0220858a0d5
--- /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 <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.
+
+// 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<T> {
+    value: T
+}
+
+impl<T> Drop for WrapMayNotDangle<T> {
+    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 00000000000..ef850f3a568
--- /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
+