diff --git a/src/items/associated-items.md b/src/items/associated-items.md index 68e5de163..f5dc31aae 100644 --- a/src/items/associated-items.md +++ b/src/items/associated-items.md @@ -293,22 +293,35 @@ type that the definition has to implement. An *associated constant definition* defines a constant associated with a type. It is written the same as a [constant item]. -Unlike [free] constants, associated constant definitions undergo -[constant evaluation] only when referenced. +Associated constant definitions undergo [constant evaluation] only when +referenced. Further, definitions that include [generic parameters] are +evaluated after monomorphization. -```rust +```rust,compile_fail struct Struct; +struct GenericStruct; impl Struct { - const ID: i32 = 1; // Definition not immediately evaluated const PANIC: () = panic!("compile-time panic"); } +impl GenericStruct { + // Definition not immediately evaluated + const NON_ZERO: () = if ID == 0 { + panic!("contradiction") + }; +} + fn main() { - assert_eq!(1, Struct::ID); // Referencing Struct::PANIC causes compilation error - // let _ = Struct::PANIC; + let _ = Struct::PANIC; + + // Fine, ID is not 0 + let _ = GenericStruct::<1>::NON_ZERO; + + // Compilation error from evaluating NON_ZERO with ID=0 + let _ = GenericStruct::<0>::NON_ZERO; } ``` @@ -381,5 +394,4 @@ fn main() { [regular function parameters]: functions.md#attributes-on-function-parameters [generic parameters]: generics.md [where clauses]: generics.md#where-clauses -[free]: ../glossary.md#free-item [constant evaluation]: ../const_eval.md