From 8412da6829cd9f71f33a039a24ea3470f586f250 Mon Sep 17 00:00:00 2001 From: 1000teslas <47207223+1000teslas@users.noreply.github.com> Date: Tue, 2 Feb 2021 03:20:56 +1100 Subject: [PATCH] Add tests --- .../{issue-81365.rs => issue-81365-1.rs} | 0 ...ssue-81365.stderr => issue-81365-1.stderr} | 2 +- src/test/ui/borrowck/issue-81365-10.rs | 26 +++++++++++++++ src/test/ui/borrowck/issue-81365-10.stderr | 13 ++++++++ src/test/ui/borrowck/issue-81365-11.rs | 32 +++++++++++++++++++ src/test/ui/borrowck/issue-81365-11.stderr | 13 ++++++++ src/test/ui/borrowck/issue-81365-8.stderr | 15 +++++++++ src/test/ui/borrowck/issue-81365-9.rs | 26 +++++++++++++++ src/test/ui/borrowck/issue-81365-9.stderr | 13 ++++++++ 9 files changed, 139 insertions(+), 1 deletion(-) rename src/test/ui/borrowck/{issue-81365.rs => issue-81365-1.rs} (100%) rename src/test/ui/borrowck/{issue-81365.stderr => issue-81365-1.stderr} (94%) create mode 100644 src/test/ui/borrowck/issue-81365-10.rs create mode 100644 src/test/ui/borrowck/issue-81365-10.stderr create mode 100644 src/test/ui/borrowck/issue-81365-11.rs create mode 100644 src/test/ui/borrowck/issue-81365-11.stderr create mode 100644 src/test/ui/borrowck/issue-81365-8.stderr create mode 100644 src/test/ui/borrowck/issue-81365-9.rs create mode 100644 src/test/ui/borrowck/issue-81365-9.stderr diff --git a/src/test/ui/borrowck/issue-81365.rs b/src/test/ui/borrowck/issue-81365-1.rs similarity index 100% rename from src/test/ui/borrowck/issue-81365.rs rename to src/test/ui/borrowck/issue-81365-1.rs diff --git a/src/test/ui/borrowck/issue-81365.stderr b/src/test/ui/borrowck/issue-81365-1.stderr similarity index 94% rename from src/test/ui/borrowck/issue-81365.stderr rename to src/test/ui/borrowck/issue-81365-1.stderr index a7dc5366f807..f680cd629d2f 100644 --- a/src/test/ui/borrowck/issue-81365.stderr +++ b/src/test/ui/borrowck/issue-81365-1.stderr @@ -1,5 +1,5 @@ error[E0506]: cannot assign to `self.container_field` because it is borrowed - --> $DIR/issue-81365.rs:21:9 + --> $DIR/issue-81365-1.rs:21:9 | LL | let first = &self.target_field; | ---- borrow of `self.container_field` occurs here diff --git a/src/test/ui/borrowck/issue-81365-10.rs b/src/test/ui/borrowck/issue-81365-10.rs new file mode 100644 index 000000000000..7602e184a9f9 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-10.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &self.deref().target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-10.stderr b/src/test/ui/borrowck/issue-81365-10.stderr new file mode 100644 index 000000000000..891f70ed7f6b --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-10.stderr @@ -0,0 +1,13 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-10.rs:21:9 + | +LL | let first = &self.deref().target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-11.rs b/src/test/ui/borrowck/issue-81365-11.rs new file mode 100644 index 000000000000..6b558c65d3d6 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-11.rs @@ -0,0 +1,32 @@ +use std::ops::{Deref, DerefMut}; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl DerefMut for Container { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &mut self.target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-11.stderr b/src/test/ui/borrowck/issue-81365-11.stderr new file mode 100644 index 000000000000..0770c136632d --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-11.stderr @@ -0,0 +1,13 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-11.rs:27:9 + | +LL | let first = &mut self.target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-8.stderr b/src/test/ui/borrowck/issue-81365-8.stderr new file mode 100644 index 000000000000..0656c65c8232 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-8.stderr @@ -0,0 +1,15 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-8.rs:21:9 + | +LL | let first = &(*self).target_field; + | ------- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `DerefTarget` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-9.rs b/src/test/ui/borrowck/issue-81365-9.rs new file mode 100644 index 000000000000..cd57afa288df --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-9.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &Deref::deref(self).target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-9.stderr b/src/test/ui/borrowck/issue-81365-9.stderr new file mode 100644 index 000000000000..c7d48214fd4a --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-9.stderr @@ -0,0 +1,13 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-9.rs:21:9 + | +LL | let first = &Deref::deref(self).target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`.