diff options
| author | Christoph Schmidler <c.schmidler@gmail.com> | 2019-12-12 17:23:14 +0100 |
|---|---|---|
| committer | Christoph Schmidler <c.schmidler@gmail.com> | 2020-03-05 08:09:52 +0100 |
| commit | 337af5ef7a31855fd7f6d6b77c9e52d6d747c350 (patch) | |
| tree | 336c013d30a7e338a35ac597f406b0c45f104a23 | |
| parent | 75cf41afb468152611212271bae026948cd3ba46 (diff) | |
| download | rust-337af5ef7a31855fd7f6d6b77c9e52d6d747c350.tar.gz rust-337af5ef7a31855fd7f6d6b77c9e52d6d747c350.zip | |
Prepare const_limit feature gate and attribute
| -rw-r--r-- | src/doc/unstable-book/src/language-features/const-limit.md | 7 | ||||
| -rw-r--r-- | src/librustc/middle/limits.rs (renamed from src/librustc/middle/recursion_limit.rs) | 3 | ||||
| -rw-r--r-- | src/librustc_feature/active.rs | 3 | ||||
| -rw-r--r-- | src/librustc_feature/builtin_attrs.rs | 4 | ||||
| -rw-r--r-- | src/librustc_session/session.rs | 4 | ||||
| -rw-r--r-- | src/librustc_span/symbol.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/consts/const_limit/feature-gate-const_limit.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/consts/const_limit/feature-gate-const_limit.stderr | 12 |
8 files changed, 45 insertions, 1 deletions
diff --git a/src/doc/unstable-book/src/language-features/const-limit.md b/src/doc/unstable-book/src/language-features/const-limit.md new file mode 100644 index 00000000000..2fc5963dc6e --- /dev/null +++ b/src/doc/unstable-book/src/language-features/const-limit.md @@ -0,0 +1,7 @@ +# `const_limit` + +The tracking issue for this feature is: [#67217] + +[#57563]: https://github.com/rust-lang/rust/issues/67217 + +The `const_limit` allows someone to limit the evaluation steps the CTFE undertakes to evaluate a `const fn`. \ No newline at end of file diff --git a/src/librustc/middle/recursion_limit.rs b/src/librustc/middle/limits.rs index ae31a2cc63d..a831d99d4ed 100644 --- a/src/librustc/middle/recursion_limit.rs +++ b/src/librustc/middle/limits.rs @@ -1,4 +1,4 @@ -// Recursion limit. +// Registering limits, recursion_limit, type_length_limit and const_limit // // There are various parts of the compiler that must impose arbitrary limits // on how deeply they recurse to prevent stack overflow. Users can override @@ -16,6 +16,7 @@ use rustc_data_structures::sync::Once; pub fn update_limits(sess: &Session, krate: &ast::Crate) { update_limit(sess, krate, &sess.recursion_limit, sym::recursion_limit, 128); update_limit(sess, krate, &sess.type_length_limit, sym::type_length_limit, 1048576); + update_limit(sess, krate, &sess.const_limit, sym::const_limit, 128); } fn update_limit( diff --git a/src/librustc_feature/active.rs b/src/librustc_feature/active.rs index 0082f4f1a6e..2f9394cd566 100644 --- a/src/librustc_feature/active.rs +++ b/src/librustc_feature/active.rs @@ -532,6 +532,9 @@ declare_features! ( /// Allows using `&mut` in constant functions. (active, const_mut_refs, "1.41.0", Some(57349), None), + // Allows limiting the evaluation steps of const expressions + (active, const_limit, "1.41.0", Some(67217), None), + /// Allows the use of `loop` and `while` in constants. (active, const_loop, "1.41.0", Some(52000), None), diff --git a/src/librustc_feature/builtin_attrs.rs b/src/librustc_feature/builtin_attrs.rs index e2e061c185c..2b79f6bd942 100644 --- a/src/librustc_feature/builtin_attrs.rs +++ b/src/librustc_feature/builtin_attrs.rs @@ -239,6 +239,10 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ // Limits: ungated!(recursion_limit, CrateLevel, template!(NameValueStr: "N")), ungated!(type_length_limit, CrateLevel, template!(NameValueStr: "N")), + gated!( + const_limit, CrateLevel, template!(NameValueStr: "N"), const_limit, + experimental!(const_limit) + ), // Entry point: ungated!(main, Normal, template!(Word)), diff --git a/src/librustc_session/session.rs b/src/librustc_session/session.rs index 2fb7977dce9..a8879f00c80 100644 --- a/src/librustc_session/session.rs +++ b/src/librustc_session/session.rs @@ -88,6 +88,9 @@ pub struct Session { /// The maximum length of types during monomorphization. pub type_length_limit: Once<usize>, + /// The maximum blocks a const expression can evaluate. + pub const_limit: Once<usize>, + /// Map from imported macro spans (which consist of /// the localized span for the macro body) to the /// macro name and definition span in the source crate. @@ -1053,6 +1056,7 @@ fn build_session_( features: Once::new(), recursion_limit: Once::new(), type_length_limit: Once::new(), + const_limit: Once::new(), imported_macro_spans: OneThread::new(RefCell::new(FxHashMap::default())), incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)), cgu_reuse_tracker, diff --git a/src/librustc_span/symbol.rs b/src/librustc_span/symbol.rs index d6232f32f4c..e92e2fc1d43 100644 --- a/src/librustc_span/symbol.rs +++ b/src/librustc_span/symbol.rs @@ -208,6 +208,7 @@ symbols! { console, const_compare_raw_pointers, const_constructor, + const_limit, const_extern_fn, const_fn, const_fn_union, diff --git a/src/test/ui/consts/const_limit/feature-gate-const_limit.rs b/src/test/ui/consts/const_limit/feature-gate-const_limit.rs new file mode 100644 index 00000000000..11d2b6af25d --- /dev/null +++ b/src/test/ui/consts/const_limit/feature-gate-const_limit.rs @@ -0,0 +1,12 @@ +#![const_limit="1"] +//~^ ERROR the `#[const_limit]` attribute is an experimental feature [E0658] + +const CONSTANT: usize = limit(); + +fn main() {} + +const fn limit() -> usize { + let x = 42; + + x * 42 +} diff --git a/src/test/ui/consts/const_limit/feature-gate-const_limit.stderr b/src/test/ui/consts/const_limit/feature-gate-const_limit.stderr new file mode 100644 index 00000000000..db248994b47 --- /dev/null +++ b/src/test/ui/consts/const_limit/feature-gate-const_limit.stderr @@ -0,0 +1,12 @@ +error[E0658]: the `#[const_limit]` attribute is an experimental feature + --> $DIR/feature-gate-const_limit.rs:1:1 + | +LL | #![const_limit="1"] + | ^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/67217 + = help: add `#![feature(const_limit)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. |
