From 31b9060ede89c7c11d7d829c3d4b50649bb7f07e Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Fri, 27 May 2016 22:05:10 +0200 Subject: [PATCH] Improve E0161 error explanation --- src/librustc/diagnostics.rs | 3 +-- src/librustc_passes/diagnostics.rs | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index a410a5949bdc8..d838de4a33122 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -438,12 +438,11 @@ This error indicates that the compiler found multiple functions with the `#[start]` attribute. This is an error because there must be a unique entry point into a Rust program. Example: - ``` #![feature(start)] #[start] -fn foo(argc: isize, argv: *const *const u8) -> isize {} // ok! +fn foo(argc: isize, argv: *const *const u8) -> isize { 0 } // ok! ``` "##, diff --git a/src/librustc_passes/diagnostics.rs b/src/librustc_passes/diagnostics.rs index 77f896e011b93..cba8bd73c014e 100644 --- a/src/librustc_passes/diagnostics.rs +++ b/src/librustc_passes/diagnostics.rs @@ -50,11 +50,36 @@ match 5u32 { "##, E0161: r##" +A value was moved. However, its size was not known at compile time, and only +values of a known size can be moved. + +Erroneous code example: + +```compile_fail +#![feature(box_syntax)] + +fn main() { + let array: &[isize] = &[1, 2, 3]; + let _x: Box<[isize]> = box *array; + // error: cannot move a value of type [isize]: the size of [isize] cannot + // be statically determined +} +``` + In Rust, you can only move a value when its size is known at compile time. To work around this restriction, consider "hiding" the value behind a reference: either `&x` or `&mut x`. Since a reference has a fixed size, this lets you move -it around as usual. +it around as usual. Example: + +``` +#![feature(box_syntax)] + +fn main() { + let array: &[isize] = &[1, 2, 3]; + let _x: Box<&[isize]> = box array; // ok! +} +``` "##, E0265: r##"