From 77387cbcaaf29c30d6fcc82f086e63217686f4b1 Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Wed, 19 Jan 2022 22:16:02 -0500 Subject: [PATCH 1/2] Note difference in CTFE timing between associated and free constants I found this difference in timing surprising and other may as well. --- src/items/associated-items.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/items/associated-items.md b/src/items/associated-items.md index afbcb5cd5..a73adcc94 100644 --- a/src/items/associated-items.md +++ b/src/items/associated-items.md @@ -293,6 +293,9 @@ 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 Constants Examples A basic example: @@ -335,6 +338,24 @@ fn main() { } ``` +[Constant evaluation] timing: + +```rust +struct Struct; + +impl Struct { + const ID: i32 = 1; + // Definition not immediately evaluated + const PANIC: () = panic!("compile-time panic"); +} + +fn main() { + assert_eq!(1, Struct::ID); + // Referencing Struct::PANIC causes compilation error + // let _ = Struct::PANIC; +} +``` + [_ConstantItem_]: constant-items.md [_Function_]: functions.md [_MacroInvocationSemi_]: ../macros.md#macro-invocation @@ -362,3 +383,5 @@ 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 From be494280f42e3f998309087250d71601150a036e Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Mon, 24 Jan 2022 11:52:51 -0500 Subject: [PATCH 2/2] Move example closer to explaination https://github.com/rust-lang/reference/pull/1120#discussion_r790816043 --- src/items/associated-items.md | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/items/associated-items.md b/src/items/associated-items.md index a73adcc94..68e5de163 100644 --- a/src/items/associated-items.md +++ b/src/items/associated-items.md @@ -296,6 +296,22 @@ type. It is written the same as a [constant item]. Unlike [free] constants, associated constant definitions undergo [constant evaluation] only when referenced. +```rust +struct Struct; + +impl Struct { + const ID: i32 = 1; + // Definition not immediately evaluated + const PANIC: () = panic!("compile-time panic"); +} + +fn main() { + assert_eq!(1, Struct::ID); + // Referencing Struct::PANIC causes compilation error + // let _ = Struct::PANIC; +} +``` + ### Associated Constants Examples A basic example: @@ -338,24 +354,6 @@ fn main() { } ``` -[Constant evaluation] timing: - -```rust -struct Struct; - -impl Struct { - const ID: i32 = 1; - // Definition not immediately evaluated - const PANIC: () = panic!("compile-time panic"); -} - -fn main() { - assert_eq!(1, Struct::ID); - // Referencing Struct::PANIC causes compilation error - // let _ = Struct::PANIC; -} -``` - [_ConstantItem_]: constant-items.md [_Function_]: functions.md [_MacroInvocationSemi_]: ../macros.md#macro-invocation