about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2015-10-08 15:17:20 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2015-10-08 19:39:27 +0200
commit0836a6f851fdcf250cdef9b38d87b53874d8f8f1 (patch)
treee129482dc16912dc2c6fbe44c12185b94859e81a
parent3448e3cd4080932e95a95c15020670eb5beebfb9 (diff)
downloadrust-0836a6f851fdcf250cdef9b38d87b53874d8f8f1.tar.gz
rust-0836a6f851fdcf250cdef9b38d87b53874d8f8f1.zip
Add E0510 error explanation
-rw-r--r--src/librustc_trans/diagnostics.rs34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/librustc_trans/diagnostics.rs b/src/librustc_trans/diagnostics.rs
index b1854d998a2..1a848a26d7e 100644
--- a/src/librustc_trans/diagnostics.rs
+++ b/src/librustc_trans/diagnostics.rs
@@ -12,6 +12,39 @@
 
 register_long_diagnostics! {
 
+E0510: r##"
+`return_address` was used in an invalid context. Erroneous code example:
+
+```
+extern "rust-intrinsic" {
+    fn return_address() -> *const u8;
+}
+
+pub unsafe fn by_value() -> i32 {
+    let _ = return_address();
+    // error: invalid use of `return_address` intrinsic: function does
+    //        not use out pointer
+    0
+}
+```
+
+Returned values are stored in registers. In the case where the returned
+type doesn't fit in a register, the function returns `()` and has an
+additional input argument, this is a pointer where the result should
+be written. Example:
+
+```
+extern "rust-intrinsic" {
+    fn return_address() -> *const u8;
+}
+
+pub unsafe fn by_pointer() -> String {
+    let _ = return_address();
+    String::new() // ok!
+}
+```
+"##,
+
 E0512: r##"
 A transmute was called on types with different sizes. Erroneous code example:
 
@@ -59,6 +92,5 @@ let x = &[0, 1, 2][2]; // ok
 }
 
 register_diagnostics! {
-    E0510, // invalid use of `return_address` intrinsic: function does not use out pointer
     E0511, // invalid monomorphization of `{}` intrinsic
 }