Skip to content

Commit 4ab9a2d

Browse files
committed
Auto merge of #30964 - GuillaumeGomez:patch-5, r=Manishearth
r? @Manishearth
2 parents f682639 + f15512e commit 4ab9a2d

File tree

1 file changed

+88
-1
lines changed

1 file changed

+88
-1
lines changed

src/librustc_borrowck/diagnostics.rs

+88-1
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,94 @@ let c = &i; // still ok!
293293
```
294294
"##,
295295

296+
E0507: r##"
297+
You tried to move out of a value which was borrowed. Erroneous code example:
298+
299+
```
300+
use std::cell::RefCell;
301+
302+
struct TheDarkKnight;
303+
304+
impl TheDarkKnight {
305+
fn nothing_is_true(self) {}
306+
}
307+
308+
fn main() {
309+
let x = RefCell::new(TheDarkKnight);
310+
311+
x.borrow().nothing_is_true(); // error: cannot move out of borrowed content
312+
}
313+
```
314+
315+
Here, the `nothing_is_true` method takes the ownership of `self`. However,
316+
`self` cannot be moved because `.borrow()` only provides an `&TheDarkKnight`,
317+
which is a borrow of the content owned by the `RefCell`. To fix this error,
318+
you have three choices:
319+
320+
* Try to avoid moving the variable.
321+
* Somehow reclaim the ownership.
322+
* Implement the `Copy` trait on the type.
323+
324+
Examples:
325+
326+
```
327+
use std::cell::RefCell;
328+
329+
struct TheDarkKnight;
330+
331+
impl TheDarkKnight {
332+
fn nothing_is_true(&self) {} // First case, we don't take ownership
333+
}
334+
335+
fn main() {
336+
let x = RefCell::new(TheDarkKnight);
337+
338+
x.borrow().nothing_is_true(); // ok!
339+
}
340+
```
341+
342+
Or:
343+
344+
```
345+
use std::cell::RefCell;
346+
347+
struct TheDarkKnight;
348+
349+
impl TheDarkKnight {
350+
fn nothing_is_true(self) {}
351+
}
352+
353+
fn main() {
354+
let x = RefCell::new(TheDarkKnight);
355+
let x = x.into_inner(); // we get back ownership
356+
357+
x.nothing_is_true(); // ok!
358+
}
359+
```
360+
361+
Or:
362+
363+
```
364+
use std::cell::RefCell;
365+
366+
#[derive(Clone, Copy)] // we implement the Copy trait
367+
struct TheDarkKnight;
368+
369+
impl TheDarkKnight {
370+
fn nothing_is_true(self) {}
371+
}
372+
373+
fn main() {
374+
let x = RefCell::new(TheDarkKnight);
375+
376+
x.borrow().nothing_is_true(); // ok!
377+
}
378+
```
379+
380+
You can find more information about borrowing in the rust-book:
381+
http://doc.rust-lang.org/stable/book/references-and-borrowing.html
382+
"##,
383+
296384
}
297385

298386
register_diagnostics! {
@@ -306,7 +394,6 @@ register_diagnostics! {
306394
E0504, // cannot move `..` into closure because it is borrowed
307395
E0505, // cannot move out of `..` because it is borrowed
308396
E0506, // cannot assign to `..` because it is borrowed
309-
E0507, // cannot move out of ..
310397
E0508, // cannot move out of type `..`, a non-copy fixed-size array
311398
E0509, // cannot move out of type `..`, which defines the `Drop` trait
312399
}

0 commit comments

Comments
 (0)