From f46e1df061c3db84769333f936740a64535c76c1 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Sun, 17 Mar 2019 19:23:44 -0700 Subject: [PATCH] Document `type_length_limit`. --- src/attributes.md | 2 ++ src/attributes/limits.md | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/attributes.md b/src/attributes.md index 313320815..7ca9098a9 100644 --- a/src/attributes.md +++ b/src/attributes.md @@ -227,6 +227,7 @@ The following is an index of all built-in attributes. - Limits - [`recursion_limit`] — Sets the maximum recursion limit for certain compile-time operations. + - [`type_length_limit`] — Sets the maximum size of a polymorphic type. - Runtime - [`panic_handler`] — Sets the function to handle panics. - [`global_allocator`] — Sets the global memory allocator. @@ -283,6 +284,7 @@ The following is an index of all built-in attributes. [`repr`]: type-layout.html#representations [`should_panic`]: attributes/testing.html#the-should_panic-attribute [`test`]: attributes/testing.html#the-test-attribute +[`type_length_limit`]: attributes/limits.html#the-type_length_limit-attribute [`used`]: abi.html#the-used-attribute [`warn`]: attributes/diagnostics.html#lint-check-attributes [`windows_subsystem`]: runtime.html#the-windows_subsystem-attribute diff --git a/src/attributes/limits.md b/src/attributes/limits.md index bc11e42d7..b57f6d9ca 100644 --- a/src/attributes/limits.md +++ b/src/attributes/limits.md @@ -7,8 +7,42 @@ The following [attributes] affect compile-time limits. The *`recursion_limit` attribute* may be applied at the crate level to set the maximum depth for potentially infinitely-recursive compile-time operations like auto-dereference or macro expansion. It uses the [_MetaNameValueStr_] -syntax to specify the recursion depth. The default is -`#![recursion_limit="64"]`. +syntax to specify the recursion depth. The default is 64. + +```rust,ignore +#![recursion_limit = "4"] + +macro_rules! a { + () => { a!(1) }; + (1) => { a!(2) }; + (2) => { a!(3) }; + (3) => { a!(4) }; + (4) => { }; +} + +// This fails to expand because it requires a recursion depth greater than 4. +a!{} +``` + +## The `type_length_limit` attribute + +The *`type_length_limit` attribute* limits the maximum size of a type +constructed during monomorphization. It is applied at the crate level, and +uses the [_MetaNameValueStr_] syntax to set the limit based on the number of +type substitutions within the type. The default value is 1048576. + +```rust,ignore +#![type_length_limit = "8"] + +type A = (B, B, B); +type B = (C, C, C); +struct C; + +// This fails to compile because monomorphizing to +// `drop::>` requires more than 8 +// type elements. +drop::>(None); +``` [attributes]: attributes.html [_MetaNameValueStr_]: attributes.html#meta-item-attribute-syntax