From 110fdb642a2fe2f680a41b47611145bc6ffdee5e Mon Sep 17 00:00:00 2001 From: Frank Steffahn Date: Mon, 18 Jul 2022 12:31:34 +0200 Subject: Add `PhantomData` marker for dropck to `BTreeMap` closes #99408 --- src/test/ui/btreemap/btreemap_dropck.rs | 16 ++++++++++++++++ src/test/ui/btreemap/btreemap_dropck.stderr | 13 +++++++++++++ src/test/ui/issues/issue-72554.rs | 5 ++++- src/test/ui/issues/issue-72554.stderr | 19 +++++++++++++++++-- 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/btreemap/btreemap_dropck.rs create mode 100644 src/test/ui/btreemap/btreemap_dropck.stderr (limited to 'src/test/ui') diff --git a/src/test/ui/btreemap/btreemap_dropck.rs b/src/test/ui/btreemap/btreemap_dropck.rs new file mode 100644 index 00000000000..c58727df30c --- /dev/null +++ b/src/test/ui/btreemap/btreemap_dropck.rs @@ -0,0 +1,16 @@ +struct PrintOnDrop<'a>(&'a str); + +impl Drop for PrintOnDrop<'_> { + fn drop(&mut self) { + println!("printint: {}", self.0); + } +} + +use std::collections::BTreeMap; +use std::iter::FromIterator; + +fn main() { + let s = String::from("Hello World!"); + let _map = BTreeMap::from_iter([((), PrintOnDrop(&s))]); + drop(s); //~ ERROR cannot move out of `s` because it is borrowed +} diff --git a/src/test/ui/btreemap/btreemap_dropck.stderr b/src/test/ui/btreemap/btreemap_dropck.stderr new file mode 100644 index 00000000000..e953e7ae82b --- /dev/null +++ b/src/test/ui/btreemap/btreemap_dropck.stderr @@ -0,0 +1,13 @@ +error[E0505]: cannot move out of `s` because it is borrowed + --> $DIR/btreemap_dropck.rs:15:10 + | +LL | let _map = BTreeMap::from_iter([((), PrintOnDrop(&s))]); + | -- borrow of `s` occurs here +LL | drop(s); + | ^ move out of `s` occurs here +LL | } + | - borrow might be used here, when `_map` is dropped and runs the `Drop` code for type `BTreeMap` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0505`. diff --git a/src/test/ui/issues/issue-72554.rs b/src/test/ui/issues/issue-72554.rs index 47aca05d778..7287639c61d 100644 --- a/src/test/ui/issues/issue-72554.rs +++ b/src/test/ui/issues/issue-72554.rs @@ -1,10 +1,13 @@ use std::collections::BTreeSet; #[derive(Hash)] -pub enum ElemDerived { //~ ERROR recursive type `ElemDerived` has infinite size +pub enum ElemDerived { + //~^ ERROR recursive type `ElemDerived` has infinite size + //~| ERROR cycle detected when computing drop-check constraints for `ElemDerived` A(ElemDerived) } + pub enum Elem { Derived(ElemDerived) } diff --git a/src/test/ui/issues/issue-72554.stderr b/src/test/ui/issues/issue-72554.stderr index a6e44be636a..3e5adcae133 100644 --- a/src/test/ui/issues/issue-72554.stderr +++ b/src/test/ui/issues/issue-72554.stderr @@ -3,6 +3,7 @@ error[E0072]: recursive type `ElemDerived` has infinite size | LL | pub enum ElemDerived { | ^^^^^^^^^^^^^^^^^^^^ recursive type has infinite size +... LL | A(ElemDerived) | ----------- recursive without indirection | @@ -11,6 +12,20 @@ help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `ElemDerived LL | A(Box) | ++++ + -error: aborting due to previous error +error[E0391]: cycle detected when computing drop-check constraints for `ElemDerived` + --> $DIR/issue-72554.rs:4:1 + | +LL | pub enum ElemDerived { + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: ...which immediately requires computing drop-check constraints for `ElemDerived` again +note: cycle used when computing drop-check constraints for `Elem` + --> $DIR/issue-72554.rs:11:1 + | +LL | pub enum Elem { + | ^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0072`. +Some errors have detailed explanations: E0072, E0391. +For more information about an error, try `rustc --explain E0072`. -- cgit 1.4.1-3-g733a5