From 517c0c4488261b793fe5cd8353c0defb60d7c5e2 Mon Sep 17 00:00:00 2001 From: Rain Date: Fri, 22 May 2026 19:48:01 -0700 Subject: [PATCH] [spr] initial version Created using spr 1.3.6-beta.1 --- .../invalid/bi_hash_entry_and_modify_stash.rs | 34 +++++++++++++++ .../bi_hash_entry_and_modify_stash.stderr | 13 ++++++ ..._hash_occupied_entry_mut_for_each_stash.rs | 42 +++++++++++++++++++ ...h_occupied_entry_mut_for_each_stash.stderr | 13 ++++++ .../invalid/id_hash_entry_and_modify_stash.rs | 28 +++++++++++++ .../id_hash_entry_and_modify_stash.stderr | 13 ++++++ .../invalid/id_ord_entry_and_modify_stash.rs | 28 +++++++++++++ .../id_ord_entry_and_modify_stash.stderr | 13 ++++++ 8 files changed, 184 insertions(+) create mode 100644 crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.rs create mode 100644 crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.stderr create mode 100644 crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.rs create mode 100644 crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.stderr create mode 100644 crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.rs create mode 100644 crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.stderr create mode 100644 crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.rs create mode 100644 crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.stderr diff --git a/crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.rs b/crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.rs new file mode 100644 index 0000000..6580e42 --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.rs @@ -0,0 +1,34 @@ +use iddqd::{BiHashItem, BiHashMap, bi_upcast}; + +#[derive(Debug)] +struct Item { + id: u32, + key2: u32, +} + +impl BiHashItem for Item { + type K1<'a> = u32; + type K2<'a> = u32; + + fn key1(&self) -> Self::K1<'_> { + self.id + } + + fn key2(&self) -> Self::K2<'_> { + self.key2 + } + + bi_upcast!(); +} + +fn main() { + let mut map = BiHashMap::::new(); + map.insert_unique(Item { id: 0, key2: 10 }).unwrap(); + + let mut stashed = Vec::new(); + map.entry(0, 10).and_modify(|item| { + stashed.push(item); + }); + + stashed[0].id = 1; +} diff --git a/crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.stderr b/crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.stderr new file mode 100644 index 0000000..31e08aa --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/bi_hash_entry_and_modify_stash.stderr @@ -0,0 +1,13 @@ +error[E0521]: borrowed data escapes outside of closure + --> tests/ui/invalid/bi_hash_entry_and_modify_stash.rs:30:9 + | +28 | let mut stashed = Vec::new(); + | ----------- `stashed` declared here, outside of the closure body +29 | map.entry(0, 10).and_modify(|item| { + | ---- `item` is a reference that is only valid in the closure body +30 | stashed.push(item); + | ^^^^^^^^^^^^^^^^^^ `item` escapes the closure body here + | + = note: requirement occurs because of a mutable reference to `Vec>` + = note: mutable references are invariant over their type parameter + = help: see for more information about variance diff --git a/crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.rs b/crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.rs new file mode 100644 index 0000000..989f7f2 --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.rs @@ -0,0 +1,42 @@ +use iddqd::{BiHashItem, bi_hash_map, bi_upcast}; + +#[derive(Debug)] +struct Item { + id: u32, + key2: u32, +} + +impl BiHashItem for Item { + type K1<'a> = u32; + type K2<'a> = u32; + + fn key1(&self) -> Self::K1<'_> { + self.id + } + + fn key2(&self) -> Self::K2<'_> { + self.key2 + } + + bi_upcast!(); +} + +fn main() { + let mut map = bi_hash_map! { + Item { id: 0, key2: 10 }, + Item { id: 1, key2: 11 }, + }; + + let mut entry = match map.entry(0, 11) { + iddqd::bi_hash_map::Entry::Occupied(entry) => entry, + iddqd::bi_hash_map::Entry::Vacant(_) => unreachable!(), + }; + + let mut refs = entry.get_mut(); + let mut stashed = Vec::new(); + refs.for_each(|item| { + stashed.push(item); + }); + + stashed[0].id = 2; +} diff --git a/crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.stderr b/crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.stderr new file mode 100644 index 0000000..169ab80 --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.stderr @@ -0,0 +1,13 @@ +error[E0521]: borrowed data escapes outside of closure + --> tests/ui/invalid/bi_hash_occupied_entry_mut_for_each_stash.rs:38:9 + | +36 | let mut stashed = Vec::new(); + | ----------- `stashed` declared here, outside of the closure body +37 | refs.for_each(|item| { + | ---- `item` is a reference that is only valid in the closure body +38 | stashed.push(item); + | ^^^^^^^^^^^^^^^^^^ `item` escapes the closure body here + | + = note: requirement occurs because of a mutable reference to `Vec>` + = note: mutable references are invariant over their type parameter + = help: see for more information about variance diff --git a/crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.rs b/crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.rs new file mode 100644 index 0000000..2e1b30d --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.rs @@ -0,0 +1,28 @@ +use iddqd::{IdHashItem, IdHashMap, id_upcast}; + +#[derive(Debug)] +struct Item { + id: u32, +} + +impl IdHashItem for Item { + type Key<'a> = u32; + + fn key(&self) -> Self::Key<'_> { + self.id + } + + id_upcast!(); +} + +fn main() { + let mut map = IdHashMap::::new(); + map.insert_unique(Item { id: 0 }).unwrap(); + + let mut stashed = Vec::new(); + map.entry(0).and_modify(|item| { + stashed.push(item); + }); + + stashed[0].id = 1; +} diff --git a/crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.stderr b/crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.stderr new file mode 100644 index 0000000..a3eb2f5 --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/id_hash_entry_and_modify_stash.stderr @@ -0,0 +1,13 @@ +error[E0521]: borrowed data escapes outside of closure + --> tests/ui/invalid/id_hash_entry_and_modify_stash.rs:24:9 + | +22 | let mut stashed = Vec::new(); + | ----------- `stashed` declared here, outside of the closure body +23 | map.entry(0).and_modify(|item| { + | ---- `item` is a reference that is only valid in the closure body +24 | stashed.push(item); + | ^^^^^^^^^^^^^^^^^^ `item` escapes the closure body here + | + = note: requirement occurs because of a mutable reference to `Vec>` + = note: mutable references are invariant over their type parameter + = help: see for more information about variance diff --git a/crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.rs b/crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.rs new file mode 100644 index 0000000..ee2ccb9 --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.rs @@ -0,0 +1,28 @@ +use iddqd::{IdOrdItem, IdOrdMap, id_upcast}; + +#[derive(Debug)] +struct Item { + id: u32, +} + +impl IdOrdItem for Item { + type Key<'a> = u32; + + fn key(&self) -> Self::Key<'_> { + self.id + } + + id_upcast!(); +} + +fn main() { + let mut map = IdOrdMap::::new(); + map.insert_unique(Item { id: 0 }).unwrap(); + + let mut stashed = Vec::new(); + map.entry(0).and_modify(|item| { + stashed.push(item); + }); + + stashed[0].id = 1; +} diff --git a/crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.stderr b/crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.stderr new file mode 100644 index 0000000..a95b0b6 --- /dev/null +++ b/crates/iddqd/tests/ui/invalid/id_ord_entry_and_modify_stash.stderr @@ -0,0 +1,13 @@ +error[E0521]: borrowed data escapes outside of closure + --> tests/ui/invalid/id_ord_entry_and_modify_stash.rs:24:9 + | +22 | let mut stashed = Vec::new(); + | ----------- `stashed` declared here, outside of the closure body +23 | map.entry(0).and_modify(|item| { + | ---- `item` is a reference that is only valid in the closure body +24 | stashed.push(item); + | ^^^^^^^^^^^^^^^^^^ `item` escapes the closure body here + | + = note: requirement occurs because of a mutable reference to `Vec>` + = note: mutable references are invariant over their type parameter + = help: see for more information about variance