From 072b0155151329b323540d521bffe3eb49873799 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Thu, 1 Mar 2012 10:11:28 +0100 Subject: [PATCH] Add test case for #1894 --- src/test/run-pass/last-use-corner-cases.rs | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/test/run-pass/last-use-corner-cases.rs diff --git a/src/test/run-pass/last-use-corner-cases.rs b/src/test/run-pass/last-use-corner-cases.rs new file mode 100644 index 00000000000..68a230f52a0 --- /dev/null +++ b/src/test/run-pass/last-use-corner-cases.rs @@ -0,0 +1,31 @@ +fn main() { + // Make sure closing over can be a last use + let q = ~10; + let addr = ptr::addr_of(*q); + let f = fn@() -> *int { ptr::addr_of(*q) }; + assert addr == f(); + + // But only when it really is the last use + let q = ~20; + let f = fn@() -> *int { ptr::addr_of(*q) }; + assert ptr::addr_of(*q) != f(); + + // Ensure function arguments and box arguments interact sanely. + fn call_me(x: fn() -> int, y: ~int) { assert x() == *y; } + let q = ~30; + call_me({|| *q}, q); + + // Check that no false positives are found in loops. + let q = ~40, p = 10; + while true { + let i = q; + p += *i; + if p > 100 { break; } + } + + // Verify that blocks can't interfere with each other. + fn two_blocks(a: fn(), b: fn()) { a(); b(); a(); b(); } + let q = ~50; + two_blocks({|| let a = q; assert *a == 50;}, + {|| let a = q; assert *a == 50;}); +}