Skip to content

Commit

Permalink
Small fix concerning drop and added tests for drop
Browse files Browse the repository at this point in the history
  • Loading branch information
hundsdor committed Mar 15, 2024
1 parent 40065d7 commit 6fb57d8
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 27 deletions.
23 changes: 12 additions & 11 deletions src/static_rts/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
let ty = self.monomorphize(ty);
// 2. function -> contained closure
visit_fn_use(tcx, ty, false, source, self.output, EdgeType::Contained);
visit_drop_use(tcx, ty, false, source, self.output);
}
if let TyKind::Ref(_region, ty, _mtblt) = *ty.kind() {
// Also account for closures behind references
Expand Down Expand Up @@ -1123,18 +1124,18 @@ fn collect_used_items<'tcx>(
instance: Instance<'tcx>,
output: &mut MonoItems<'tcx>,
) {
let body = tcx.instance_mir(instance.def);
let body = tcx.instance_mir(instance.def);

// Here we rely on the visitor also visiting `required_consts`, so that we evaluate them
// and abort compilation if any of them errors.
MirUsedCollector {
tcx,
body,
output,
instance,
visiting_call_terminator: false,
}
.visit_body(body);
// Here we rely on the visitor also visiting `required_consts`, so that we evaluate them
// and abort compilation if any of them errors.
MirUsedCollector {
tcx,
body,
output,
instance,
visiting_call_terminator: false,
}
.visit_body(body);
}

fn collect_const_value<'tcx>(
Expand Down
1 change: 0 additions & 1 deletion test-data/blackbox/adt/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ edition = "2021"
[features]
changes_display = []
changes_debug = []
changes_drop = []

[dependencies]
13 changes: 0 additions & 13 deletions test-data/blackbox/adt/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,6 @@ impl Debug for Foo<u32> {
}
}

static mut DROPPED: bool = false;

impl<T> Drop for Foo<T> {
#[cfg(not(feature = "changes_drop"))]
fn drop(&mut self) {
unsafe { DROPPED = true };
}

#[cfg(feature = "changes_drop")]
fn drop(&mut self) {}
}

fn generic_display<S: Display>(s: &S, buf: &mut impl Write) {
buf.write_fmt(format_args!("{}", s)).unwrap();
}
Expand Down Expand Up @@ -84,7 +72,6 @@ pub mod test {
let instance: Foo<i32> = Foo { data: 1 };
assert_eq!(format!("{}", instance), "Foo: 1");
}
assert!(unsafe { DROPPED });
}

#[test]
Expand Down
14 changes: 14 additions & 0 deletions test-data/blackbox/drop/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "drop"
version = "0.1.0"
edition = "2021"

[features]
changes_drop = []
drop_inner = []
drop_outer = []
drop_direct = []
drop_delegate = []
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
57 changes: 57 additions & 0 deletions test-data/blackbox/drop/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
static mut DROPPED: bool = false;

struct Foo {
data: i32,
}
struct Bar {
data: i32,
foo: Foo,
}

#[cfg(feature = "drop_inner")]
impl Drop for Foo {
fn drop(&mut self) {
println!("Data {}", self.data);
#[cfg(not(feature = "changes_drop"))]
unsafe {
DROPPED = true;
}
}
}

#[cfg(feature = "drop_outer")]
impl Drop for Bar {
fn drop(&mut self) {
println!("Data {}", self.data);
println!("Foo {}", self.foo.data);
#[cfg(not(feature = "changes_drop"))]
unsafe {
DROPPED = true;
}
}
}

#[cfg(feature = "drop_delegate")]
fn delegate<T>(t: T) {}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_drop() {
{
let bar = Bar {
data: 1,
foo: Foo { data: 2 },
};

#[cfg(feature = "drop_direct")]
drop(bar);

#[cfg(feature = "drop_delegate")]
delegate(bar);
}
assert!(unsafe { DROPPED })
}
}
9 changes: 9 additions & 0 deletions test-data/manual/allocator/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[package]
name = "allocator"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
jemallocator = "0.1"
16 changes: 16 additions & 0 deletions test-data/manual/allocator/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
extern crate jemallocator;

fn main() {
println!("Hello, world!");
}

#[global_allocator]
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;


#[test]
fn test() {
let mut foo = String::new();
foo.push_str("Foo");
assert_eq!(foo, "Foo");
}
14 changes: 12 additions & 2 deletions tests/blackbox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,18 @@ fn check_same_crate_id(mode: Mode) {
#[test_case(Mode::Static, "adt", "", "changes_display")]
#[test_case(Mode::Dynamic, "adt", "", "changes_debug")]
#[test_case(Mode::Static, "adt", "", "changes_debug")]
#[test_case(Mode::Dynamic, "adt", "", "changes_drop")]
#[test_case(Mode::Static, "adt", "", "changes_drop")]
#[test_case(Mode::Dynamic, "drop", "drop_inner", "drop_inner,changes_drop")]
#[test_case(Mode::Static, "drop", "drop_inner", "drop_inner,changes_drop")]
#[test_case(Mode::Dynamic, "drop", "drop_outer", "drop_outer,changes_drop")]
#[test_case(Mode::Static, "drop", "drop_outer", "drop_outer,changes_drop")]
#[test_case(Mode::Dynamic, "drop", "drop_inner,drop_direct", "drop_inner,drop_direct,changes_drop")]
#[test_case(Mode::Static, "drop", "drop_inner,drop_direct", "drop_inner,drop_direct,changes_drop")]
#[test_case(Mode::Dynamic, "drop", "drop_outer,drop_direct", "drop_outer,drop_direct,changes_drop")]
#[test_case(Mode::Static, "drop", "drop_outer,drop_direct", "drop_outer,drop_direct,changes_drop")]
#[test_case(Mode::Dynamic, "drop", "drop_inner,drop_delegate", "drop_inner,drop_delegate,changes_drop")]
#[test_case(Mode::Static, "drop", "drop_inner,drop_delegate", "drop_inner,drop_delegate,changes_drop")]
#[test_case(Mode::Dynamic, "drop", "drop_outer,drop_delegate", "drop_outer,drop_delegate,changes_drop")]
#[test_case(Mode::Static, "drop", "drop_outer,drop_delegate", "drop_outer,drop_delegate,changes_drop")]
#[test_case(Mode::Dynamic, "command", "", "changes_return")]
#[test_case(Mode::Dynamic, "dynamic", "", "changes_direct")]
#[test_case(Mode::Static, "dynamic", "", "changes_direct")]
Expand Down

0 comments on commit 6fb57d8

Please sign in to comment.