Skip to content

Commit 3c08ed8

Browse files
committed
librustc: Require the ref keyword to get by-reference closure
captures. Because captured variables are now captured by value by default, this breaks code like: let mut a = 10; [ 1i, 2, 3 ].iter().map(|x| a += *x); Change this code to: let mut a = 10; [ 1i, 2, 3 ].iter().map(ref |x| a += *x); As a simple change, you may wish to uniformly add the `ref` keyword to all old boxed closures. This will guarantee that the semantics remain the same. Issue rust-lang#12831. [breaking-change]
1 parent 3f5d0b5 commit 3c08ed8

File tree

242 files changed

+2116
-1633
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

242 files changed

+2116
-1633
lines changed

src/compiletest/compiletest.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ pub fn make_tests(config: &Config) -> Vec<test::TestDescAndFn> {
295295
let file = file.clone();
296296
debug!("inspecting file {}", file.display());
297297
if is_test(config, &file) {
298-
let t = make_test(config, &file, || {
298+
let t = make_test(config, &file, ref || {
299299
match config.mode {
300300
Codegen => make_metrics_test_closure(config, &file),
301301
_ => make_test_closure(config, &file)

src/compiletest/header.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub fn load_props(testfile: &Path) -> TestProps {
5757
let mut no_pretty_expanded = false;
5858
let mut pretty_mode = None;
5959
let mut pretty_compare_only = false;
60-
iter_header(testfile, |ln| {
60+
iter_header(testfile, ref |ln| {
6161
match parse_error_pattern(ln) {
6262
Some(ep) => error_patterns.push(ep),
6363
None => ()

src/compiletest/runtest.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -643,13 +643,13 @@ fn parse_debugger_commands(file_path: &Path, debugger_prefix: &str)
643643

644644
header::parse_name_value_directive(
645645
line.as_slice(),
646-
command_directive.as_slice()).map(|cmd| {
646+
command_directive.as_slice()).map(ref |cmd| {
647647
commands.push(cmd)
648648
});
649649

650650
header::parse_name_value_directive(
651651
line.as_slice(),
652-
check_directive.as_slice()).map(|cmd| {
652+
check_directive.as_slice()).map(ref |cmd| {
653653
check_lines.push(cmd)
654654
});
655655
}

src/doc/guide-container.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ into a single value:
156156

157157
~~~
158158
let xs = [1i, 9, 2, 3, 14, 12];
159-
let result = xs.iter().fold(0, |accumulator, item| accumulator - *item);
159+
let result = xs.iter().fold(0, ref |accumulator, item| accumulator - *item);
160160
assert_eq!(result, -41);
161161
~~~
162162

@@ -165,7 +165,7 @@ Most adaptors return an adaptor object implementing the `Iterator` trait itself:
165165
~~~
166166
let xs = [1i, 9, 2, 3, 14, 12];
167167
let ys = [5i, 2, 1, 8];
168-
let sum = xs.iter().chain(ys.iter()).fold(0, |a, b| a + *b);
168+
let sum = xs.iter().chain(ys.iter()).fold(0, ref |a, b| a + *b);
169169
assert_eq!(sum, 57);
170170
~~~
171171

@@ -184,7 +184,7 @@ let xs = [1i,2,3,4,5];
184184
let mut calls = 0i;
185185
186186
{
187-
let it = xs.iter().scan((), |_, x| {
187+
let it = xs.iter().scan((), ref |_, x| {
188188
calls += 1;
189189
if *x < 3 { Some(x) } else { None }});
190190
@@ -266,7 +266,7 @@ Iterators offer generic conversion to containers with the `collect` adaptor:
266266

267267
~~~
268268
let xs = [0i, 1, 1, 2, 3, 5, 8];
269-
let ys = xs.iter().rev().skip(1).map(|&x| x * 2).collect::<Vec<int>>();
269+
let ys = xs.iter().rev().skip(1).map(ref |&x| x * 2).collect::<Vec<int>>();
270270
assert_eq!(ys, vec![10, 6, 4, 2, 2, 0]);
271271
~~~
272272

@@ -365,7 +365,7 @@ The `chain`, `map`, `filter`, `filter_map` and `inspect` adaptors are
365365
~~~
366366
let xs = [1i, 2, 3, 4];
367367
let ys = [5i, 6, 7, 8];
368-
let mut it = xs.iter().chain(ys.iter()).map(|&x| x * 2);
368+
let mut it = xs.iter().chain(ys.iter()).map(ref |&x| x * 2);
369369
370370
println!("{}", it.next()); // prints `Some(2)`
371371

src/liballoc/heap.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ mod bench {
331331

332332
#[bench]
333333
fn alloc_owned_small(b: &mut Bencher) {
334-
b.iter(|| {
334+
b.iter(ref || {
335335
box 10i
336336
})
337337
}

src/libarena/lib.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,8 @@ fn test_arena_alloc_nested() {
316316

317317
let arena = Arena::new();
318318

319-
let result = arena.alloc(|| Outer {
320-
inner: arena.alloc(|| Inner { value: 10 })
319+
let result = arena.alloc(ref || Outer {
320+
inner: arena.alloc(ref || Inner { value: 10 })
321321
});
322322

323323
assert_eq!(result.inner.value, 10);
@@ -527,7 +527,7 @@ mod tests {
527527
#[bench]
528528
pub fn bench_copy(b: &mut Bencher) {
529529
let arena = TypedArena::new();
530-
b.iter(|| {
530+
b.iter(ref || {
531531
arena.alloc(Point {
532532
x: 1,
533533
y: 2,
@@ -538,7 +538,7 @@ mod tests {
538538

539539
#[bench]
540540
pub fn bench_copy_nonarena(b: &mut Bencher) {
541-
b.iter(|| {
541+
b.iter(ref || {
542542
box Point {
543543
x: 1,
544544
y: 2,
@@ -550,8 +550,8 @@ mod tests {
550550
#[bench]
551551
pub fn bench_copy_old_arena(b: &mut Bencher) {
552552
let arena = Arena::new();
553-
b.iter(|| {
554-
arena.alloc(|| {
553+
b.iter(ref || {
554+
arena.alloc(ref || {
555555
Point {
556556
x: 1,
557557
y: 2,
@@ -580,7 +580,7 @@ mod tests {
580580
#[bench]
581581
pub fn bench_noncopy(b: &mut Bencher) {
582582
let arena = TypedArena::new();
583-
b.iter(|| {
583+
b.iter(ref || {
584584
arena.alloc(Noncopy {
585585
string: "hello world".to_string(),
586586
array: vec!( 1, 2, 3, 4, 5 ),
@@ -590,7 +590,7 @@ mod tests {
590590

591591
#[bench]
592592
pub fn bench_noncopy_nonarena(b: &mut Bencher) {
593-
b.iter(|| {
593+
b.iter(ref || {
594594
box Noncopy {
595595
string: "hello world".to_string(),
596596
array: vec!( 1, 2, 3, 4, 5 ),
@@ -601,8 +601,8 @@ mod tests {
601601
#[bench]
602602
pub fn bench_noncopy_old_arena(b: &mut Bencher) {
603603
let arena = Arena::new();
604-
b.iter(|| {
605-
arena.alloc(|| Noncopy {
604+
b.iter(ref || {
605+
arena.alloc(ref || Noncopy {
606606
string: "hello world".to_string(),
607607
array: vec!( 1, 2, 3, 4, 5 ),
608608
})

src/libcollections/bitv.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,11 @@ impl Bitv {
458458
pub fn all(&self) -> bool {
459459
let mut last_word = !0u;
460460
// Check that every word but the last is all-ones...
461-
self.mask_words(0).all(|(_, elem)|
462-
{ let tmp = last_word; last_word = elem; tmp == !0u }) &&
461+
self.mask_words(0).all(ref |(_, elem)| {
462+
let tmp = last_word;
463+
last_word = elem;
464+
tmp == !0u
465+
}) &&
463466
// ...and that the last word is ones as far as it needs to be
464467
(last_word == ((1 << self.nbits % uint::BITS) - 1) || last_word == !0u)
465468
}
@@ -2560,7 +2563,7 @@ mod tests {
25602563
fn bench_uint_small(b: &mut Bencher) {
25612564
let mut r = rng();
25622565
let mut bitv = 0 as uint;
2563-
b.iter(|| {
2566+
b.iter(ref || {
25642567
bitv |= 1 << ((r.next_u32() as uint) % uint::BITS);
25652568
&bitv
25662569
})
@@ -2570,7 +2573,7 @@ mod tests {
25702573
fn bench_bitv_big(b: &mut Bencher) {
25712574
let mut r = rng();
25722575
let mut bitv = Bitv::with_capacity(BENCH_BITS, false);
2573-
b.iter(|| {
2576+
b.iter(ref || {
25742577
bitv.set((r.next_u32() as uint) % BENCH_BITS, true);
25752578
&bitv
25762579
})
@@ -2580,7 +2583,7 @@ mod tests {
25802583
fn bench_bitv_small(b: &mut Bencher) {
25812584
let mut r = rng();
25822585
let mut bitv = Bitv::with_capacity(uint::BITS, false);
2583-
b.iter(|| {
2586+
b.iter(ref || {
25842587
bitv.set((r.next_u32() as uint) % uint::BITS, true);
25852588
&bitv
25862589
})
@@ -2590,7 +2593,7 @@ mod tests {
25902593
fn bench_bitv_set_small(b: &mut Bencher) {
25912594
let mut r = rng();
25922595
let mut bitv = BitvSet::new();
2593-
b.iter(|| {
2596+
b.iter(ref || {
25942597
bitv.insert((r.next_u32() as uint) % uint::BITS);
25952598
&bitv
25962599
})
@@ -2600,7 +2603,7 @@ mod tests {
26002603
fn bench_bitv_set_big(b: &mut Bencher) {
26012604
let mut r = rng();
26022605
let mut bitv = BitvSet::new();
2603-
b.iter(|| {
2606+
b.iter(ref || {
26042607
bitv.insert((r.next_u32() as uint) % BENCH_BITS);
26052608
&bitv
26062609
})
@@ -2610,15 +2613,15 @@ mod tests {
26102613
fn bench_bitv_big_union(b: &mut Bencher) {
26112614
let mut b1 = Bitv::with_capacity(BENCH_BITS, false);
26122615
let b2 = Bitv::with_capacity(BENCH_BITS, false);
2613-
b.iter(|| {
2616+
b.iter(ref || {
26142617
b1.union(&b2);
26152618
})
26162619
}
26172620

26182621
#[bench]
26192622
fn bench_btv_small_iter(b: &mut Bencher) {
26202623
let bitv = Bitv::with_capacity(uint::BITS, false);
2621-
b.iter(|| {
2624+
b.iter(ref || {
26222625
let mut _sum = 0;
26232626
for pres in bitv.iter() {
26242627
_sum += pres as uint;
@@ -2629,7 +2632,7 @@ mod tests {
26292632
#[bench]
26302633
fn bench_bitv_big_iter(b: &mut Bencher) {
26312634
let bitv = Bitv::with_capacity(BENCH_BITS, false);
2632-
b.iter(|| {
2635+
b.iter(ref || {
26332636
let mut _sum = 0;
26342637
for pres in bitv.iter() {
26352638
_sum += pres as uint;
@@ -2641,7 +2644,7 @@ mod tests {
26412644
fn bench_bitvset_iter(b: &mut Bencher) {
26422645
let bitv = BitvSet::from_bitv(from_fn(BENCH_BITS,
26432646
|idx| {idx % 3 == 0}));
2644-
b.iter(|| {
2647+
b.iter(ref || {
26452648
let mut _sum = 0;
26462649
for idx in bitv.iter() {
26472650
_sum += idx;

src/libcollections/btree.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,9 @@ impl<K: Clone + Ord, V: Clone> Leaf<K, V> {
386386
if self.elts.len() > ub {
387387
let midpoint_opt = self.elts.remove(ub / 2);
388388
let midpoint = midpoint_opt.unwrap();
389-
let (left_leaf, right_leaf) = self.elts.partition(|le|
390-
le.key.cmp(&midpoint.key.clone())
391-
== Less);
389+
let (left_leaf, right_leaf) = self.elts.partition(ref |le| {
390+
le.key.cmp(&midpoint.key.clone()) == Less
391+
});
392392
let branch_return = Node::new_branch(vec!(BranchElt::new(midpoint.key.clone(),
393393
midpoint.value.clone(),
394394
box Node::new_leaf(left_leaf))),
@@ -613,9 +613,11 @@ impl<K: Clone + Ord, V: Clone> Branch<K, V> {
613613
//and two children.
614614
if self.elts.len() > ub {
615615
let midpoint = self.elts.remove(ub / 2).unwrap();
616-
let (new_left, new_right) = self.clone().elts.partition(|le|
617-
midpoint.key.cmp(&le.key)
618-
== Greater);
616+
let (new_left, new_right) = self.clone()
617+
.elts
618+
.partition(ref |le| {
619+
midpoint.key.cmp(&le.key) == Greater
620+
});
619621
new_branch = Node::new_branch(
620622
vec!(BranchElt::new(midpoint.clone().key,
621623
midpoint.clone().value,

src/libcollections/deque.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub mod bench {
3030
}
3131

3232
// measure
33-
b.iter(|| {
33+
b.iter(ref || {
3434
let k = rng.gen::<uint>() % n;
3535
map.insert(k, 1);
3636
map.remove(&k);
@@ -48,7 +48,7 @@ pub mod bench {
4848

4949
// measure
5050
let mut i = 1;
51-
b.iter(|| {
51+
b.iter(ref || {
5252
map.insert(i, 1);
5353
map.remove(&i);
5454
i = (i + 2) % n;
@@ -70,7 +70,7 @@ pub mod bench {
7070

7171
// measure
7272
let mut i = 0;
73-
b.iter(|| {
73+
b.iter(ref || {
7474
map.find(&keys[i]);
7575
i = (i + 1) % n;
7676
})
@@ -86,7 +86,7 @@ pub mod bench {
8686

8787
// measure
8888
let mut i = 0;
89-
b.iter(|| {
89+
b.iter(ref || {
9090
let x = map.find(&i);
9191
i = (i + 1) % n;
9292
x

0 commit comments

Comments
 (0)