From 9eb416b8a44478b69102189ff6ff8fdce8d4d116 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez <guillaume1.gomez@gmail.com> Date: Sat, 30 May 2015 00:44:22 +0200 Subject: [PATCH] Add E0011 explanation --- src/librustc/diagnostics.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index a3577981c1e..4597ae40161 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -176,6 +176,38 @@ for the entire lifetime of a program. Creating a boxed value allocates memory on the heap at runtime, and therefore cannot be done at compile time. "##, +E0011: r##" +Using a user-defined operator on const/static variable is restricted to what +can be evaluated at compile-time. Using an user-defined operator could call a +user-defined function, which is not allowed. + +Bad example: + +``` +use std::ops::Index; + +struct Foo { a: u8 } + +impl ::std::ops::Index<u8> for Foo { + type Output = u8; + + fn index<'a>(&'a self, idx: u8) -> &'a u8 { &self.a } +} + +const a: Foo = Foo { a: 0u8 }; +const b: u8 = a[0]; // Index trait is defined by the user, bad! +``` + +Only operators on builtin types are allowed. + +Example: + +``` +const a: &'static [i32] = &[1, 2, 3]; +const b: i32 = a[0]; // Good! +``` +"##, + E0013: r##" Static and const variables can refer to other const variables. But a const variable cannot refer to a static variable. For example, `Y` cannot refer to `X` @@ -899,7 +931,6 @@ static mut BAR: Option<Vec<i32>> = None; register_diagnostics! { - E0011, E0014, E0016, E0017,