diff --git a/src/test/run-pass/issue-27401-let-init.rs b/src/test/run-pass/issue-27401-let-init.rs new file mode 100644 index 0000000000000..dd549b68f6567 --- /dev/null +++ b/src/test/run-pass/issue-27401-let-init.rs @@ -0,0 +1,39 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// The stack-local drop flag associated with binding `let a = ...;` +// (that occurred in a loop) were failing to (re-)initialize the drop +// flag after it had been set to "moved" during an earlier iteration +// of the loop. +// +// This is a regression test to ensure we don't let that behavior +// creep back in. +// +// See also issue-27401-match-bind.rs + +struct A<'a>(&'a mut i32); + +impl<'a> Drop for A<'a> { + fn drop(&mut self) { + *self.0 += 1; + } +} + +fn main() { + let mut cnt = 0; + for i in 0..2 { + let a = A(&mut cnt); + if i == 1 { + break + } + drop(a); + } + assert_eq!(cnt, 2); +} diff --git a/src/test/run-pass/issue-27401-match-bind.rs b/src/test/run-pass/issue-27401-match-bind.rs new file mode 100644 index 0000000000000..601bd09da9f5c --- /dev/null +++ b/src/test/run-pass/issue-27401-match-bind.rs @@ -0,0 +1,45 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// The stack-local drop flag for binding in match-arm `(_, a) => ...` +// (that occurred in a loop) were failing to (re-)initialize the drop +// flag after it had been set to "moved" during an earlier iteration +// of the loop. +// +// This is a regression test to ensure we don't let that behavior +// creep back in. +// +// See also issue-27401-let-init.rs + +use std::cell::Cell; + +struct A<'a>(&'a Cell); + +impl<'a> Drop for A<'a> { + fn drop(&mut self) { + let old_val = self.0.get(); + self.0.set(old_val + 1); + } +} + +fn main() { + let cnt = Cell::new(0); + for i in 0..2 { + match (A(&cnt), A(&cnt)) { + (_, aaah) => { + if i == 1 { + break + } + drop(aaah); + } + } + } + assert_eq!(cnt.get(), 4); +}